参考资料:【spring之注解(三)Component】【spring之注解(二)Autowired】
@Bean
在采用XML配置bean的时候,我们可以使用实例工厂来定义一个Bean,采用@Bean注解我们也可以做到类似的形式。在一个Bean中定义另外一个Bean。这通过在@Component的标注类中对某个方法使用@Bean进行注解。
如下所示:
@Bean(name="getService")
@Qualifier("getService")
public UserService getService(@Qualifier("userDao") UserDao user){
UserService ser = new UserServiceIml1();
return ser;
}
上述定义一个Bean,并定义了Name和Qualifier属性。还可以定义Scope,Lazy等属性。见下个小节。
其实@Bean更多的是与@Confuguration一起使用,来构建另外一种不同于基于XML的ApplicationContext,即基于注解的,AnnotationConfigApplicationContext
@Configuration
Spring提供一种基于注解的applicationContext,实际应用中,它可以和XML的配置联合使用或者各自单独使用。
下面给一个简单的例子,其他的详细例子见Spring官方文档。
首先是一个@Configuration 的配置类,定义了两个Bean。
@Configuration
public class MyAnnoConfig {
@Bean(name="cDao1")
public UserDao getConfigDao(){
return new UserDaoImp();
}
@Bean(name="cs1")
public UserService getConfigS(@Qualifier("cDao1") UserDao dao){
UserServiceIml us =new UserServiceIml();
us.setUserDao(dao);
return us;
}
}
下面是测试函数。
public class TestAnnoContextMain {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(MyAnnoConfig.class);
UserService us = ctx.getBean("cs1",UserService.class);
System.out.println(us.getUser());
}
@Autowired
可以“自动装配依赖”。它通过类型自动注入(byType)
@Autowired可以标注在 字段、set方法和构造函数上,假如说我们例如我们依次有以下配置,并且已经在XML文件中有了bean的定义,以下的三种方式等价,均上自动注入依赖UserDao,可以和前篇使用xml 的注入依赖的方式比较:
//标注在字段上。
@Autowired
private UserDao userDao;
//标注在set方法上。
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//标注在构造函数上
@Autowired
public UserServiceIml3(UserDao userDao) {
super();
this.userDao = userDao;
}
在XML中bean定义如下:
<bean id="user1" class="com.test.service.UserServiceIml1"/>
<bean id="user2" class="com.test.service.UserServiceIml2" />
<bean id="user3" class="com.test.service.UserServiceIml3"/>
@Qualifier
@Autowired使用byType进行依赖的注入,可能会有多个匹配者(如我们有在Spring容器中有两个userDao的bean),那么这个时候就会抛出异常,因此我们需要更加细粒度的进行控制,这就是@Qualifier 登场的地方。@Qualifier 可以用到字段上,方法参数上,来从“名字”上对aotowired的候选bean进行限制。一般情况下,可以直接使用bean的name来作为@Qualifier的值来限制注入指定的bean. 当然也可以在xml中使用