Spring 三:Spring Bean装配之注解形式
Bean管理的注解实现
- ClassPath扫描与组件管理
- 类的自动检测与注册Bean
- <context:annotation-config/>
- @Component(通用注解)、@Repository(Dao层/持久层的注解)、@Service(服务层的注解)、@Controller(MVC控制层的注解)
- @Required
- @Autowired(和昨天的自动装入对比)
- @Qualifier
- @Resource
在Spring中提供了许多特性,使用java注解定义bean,减少xml的配置工作量。比如@Configuration、@Bean、@Import、@DependsOn。但是@Component是一个通用的注解,可用任何Bean。@Repository、@Service、@Controller这三个注解更具有针对性。
实现Bean的注解装配
对上一次博客的Xml配置上在增加关于Context的3项配置,并且配置<context:component-scan/>,并且其中的base-package指明要装配Bean的包。
在实际使用中,常用<context:component-scan/>,而不是常用<context:annotation-config/>;因为component是完全包含annotation,还包含AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor。
@Component
因为component这个注解是通用的,我们先测试能不能正确的装配。
在测试类中验证
结果输出:BeanAnnotation:this is ...
表示基本的配置成功。
@Autowire自动装配
我们昨天的Xml的Bean的自动配置,是首先将每个类,在xml中配置Bean,再在配置文件中添加default-autowire=“匹配类型”再配置;现在使用注解@Autowired就要简单得多。
在默认的情况下,如果找不到合适的Bean将会导致Autowired失败抛出异常,但是可以通过如下的方式避免
@Autowired(required=false) //每个类只能有一个构造器被标记为 required=true;
但是在这种情况下,可以使用@Required注解。
如下
在测试中
输出结果为:this is a Mans
表示配置成功。
使用注解的形式进一步简化了xml的配置,省去了不少工作量
@Autowired不仅使用在构造器成员变量上,也可以使用到Set方法上;如下例子。
@Autowire其他便捷使用
Autowired注解十分的强大,我们还可以使用@Autowired注解那些众所周知的解析依赖性接口,比如:BeanFactory、ApplicationContext、Environment、ResourceLoad、ApplicationEventPublish、andMessageSource。
还可以通过添加注解给需要该类型的数组或者字段或者方法,以提供ApplicationContext中所有特定类型的bean。
也可以用于装配key为String的Map;
如果希望数组有序,可以添加@Order注解。例子如下
首先创建一个接口,有两个实现类。
创建一个Controller进行使用
运行结果如下
如果想要list有序,可在实现类上加上@Order注解,效果和运行结果如下:
map本身就是无序性,所以,次序对他没有效果
@Qualifier
按类型自动装配可能多个bean的情况,可以使用spring的@Qualifier注解缩小范围,也可以用于指定单独的构造器参数或者方法参数,用于注解集合类型的变量。适用于fileds,constructors,multi-argument methods这些在参数级别使用@qualifier缩小范围的情况。
但是@Resource使用于成员变量,只有一个参数的setter方法时,所以在目标是构造器或一个多参数方法时,最好是使用qualifier.
@Resource
如果没有显示的指定@Resource的name,默认的名称是属性名或者是Setter名得出。
其中的@PostConstruct和@PreDestory的两种初始化回调和销毁回调的方式。
@inject
等效于@Autowired
@Name是使用特定进行依赖注入;@Name和@Component是等效的。
元注解
spring提供的注解可以作为自己的代码,相当于自己写的注解
如上表示 使用@interface 表示自定义一个Autobian的注解,并且这个注解继承@Autowired,拥有Autowired的所有属性,并且使用@Scope修改了Autobian的生命周期。
我们将@Autowired的列子中的@Autowired换成 @Autobian注解,是能够直接运行成功的。
使用过滤器进行自定义扫描
默认情况,类被自动发现并注册为Bean的条件是:使用注解或者使用自定义注解,但是我们可以配置Xml,通过过滤器修改默认的行为,还可以使用 use-default-filters="false" 禁止自动发现与注册。在context:component下增加两个过滤器,一个是包含,一个是不包含,使用过滤的类型,表达式....
常用的过滤器的类型如下
基于JAVA容器的注解
@Bean标识一个用于配置和初始化一个由SpringIoc容器管理的新对象的方法,类似XML配置文件的<bean/>
可以在Spring的@Component注解中使用@Bean注解任何方法,但是常常和@Bean使用的是@Configuration