1. Spring原始注解
- Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
- Spring原始注解主要是替代
<Bean> 的配置 - 注意:
使用注解进行开发时,需要在applicationContext.xml 中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
<context:component-scan base-package="com.xdr630"></context:component-scan>
2. xml 方式配置实现
userDao
public interface UserDao {
public void save();
}
userDaoImpl
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("save running...");
}
}
userService
public interface UserService {
public void save();
}
userServiceImpl
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
applicationContext.xml
<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.xdr630.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
UserController
public class UserController {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = app.getBean(UserService.class);
userService.save();
}
}
3. 注解配置方式实现
- 在 UserDaoImpl 下的注解,
@Component("userDao") 来替代 下面 bean 的配置
<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl"></bean>
@Component("userDao")
<bean id="userService" class="com.xdr630.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
- 在 applicationContext.xml 下配置组件要扫描的包
<context:component-scan base-package="com.xdr630"></context:component-scan>
-
测试: -
xml配置和注解配置达到相同的效果 -
使用 @Component 注解不能马上意识到是哪一层,所以Spring衍生了三个注解:@Repository、@Service、@Controller ,效果和@Component 效果是一样的,可读性好点。 -
注意:使用注解方式时,可以省略 set 方法。如:把 userServiceImpl 中的 set 方法删掉,也能成功运行: -
因为把注解放在属性上,直接通过反射为属性赋值,下面的方法也可以使用被赋值的属性了 -
但如果使用 xml 配置的时候 set 方法是不能省略的 -
把上面的 @Qualifier(“userDao”) 注释掉,也能成功运行,直接写@Autowired也能注入。因为@Autowired 是按照数据类型从Spring容器中进行匹配的,当Spring扫描到这个注解之后,它会直接从Spring容器当中找一个 userDao 类型的 bean,找到之后直接注入。如果容器中 UserDao 类型有多个bean,就不能这样写了 。 -
按照类型注入,@Autowired -
按照名称注入,@Autowired 和 @Qualifier 要一起使用 -
@Resources 相当于@Autowired 和 @Qualifier -
@Value 注入普通数据类型,如:把 hello 注入给 driver -
使用@Value进行字符串的注入 -
使用@Scope标注Bean的范围 -
使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法 -
这里没打印销毁的方法原因是:因为容器还没有关闭程序就执行完了,所以造成销毁的方法还没打印出来 -
手动关闭就可以看到销毁的方法打印了
4. Spring新注解
使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
- 非自定义的Bean的配置:
<bean> - 加载properties文件的配置:
<context:property-placeholder> - 组件扫描的配置:
<context:component-scan> - 引入其他文件:
<import>
@Configuration
@ComponentScan("com.xdr630")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
}
@Import({DataSourceConfiguration.class}) 里面的值其实是一个数组,可以加载多个类,如:
@Import({DataSourceConfiguration.class,xxx.class})
- 新建数据源配置类:DataSourceConfiguration,相当于分配置
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean("dataSource")
public DataSource getDataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}
public class UserController {
public static void main(String[] args) {
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);
userService.save();
}
}
|