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

 

posted @ 2018-11-07 16:40  轻抚丶两袖风尘  阅读(292)  评论(0编辑  收藏  举报