Spring注解

参考资料:【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定义如下:



@Qualifier

@Autowired使用byType进行依赖的注入,可能会有多个匹配者(如我们有在Spring容器中有两个userDao的bean),那么这个时候就会抛出异常,因此我们需要更加细粒度的进行控制,这就是@Qualifier 登场的地方。@Qualifier 可以用到字段上,方法参数上,来从“名字”上对aotowired的候选bean进行限制。一般情况下,可以直接使用bean的name来作为@Qualifier的值来限制注入指定的bean. 当然也可以在xml中使用 标签,这么做的好处是Qualifier 的值可以不是唯一的。

posted @ 2021-03-12 11:30  CalronLoveRonnie  阅读(78)  评论(0)    收藏  举报
AmazingCounters.com