注解实现Bean配置主要用来进行如依赖注入、生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数据。
注册注解处理器
• 方式一:bean
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
• 方式二: 命名空间<context:annotation-config />
<context:annotationconfig />
将隐式地向Spring 容器注册AutowiredAnnotationBeanPostProcessor 、CommonAnnotationBeanPostProcessor 、 PersistenceAnnotationBeanPostProcessor 以及RequiredAnnotationBeanPostProcessor 这4 个BeanPostProcessor 。
• 方式三: 命名空间<context:component-scan />
如果要使注解工作,则必须配置component-scan ,实际上不需要再配置annotation-config。
<context:component-scan base-package="com.spring.ioc5"> <!-- annotation 通过注解来过滤 org.example.SomeAnnotation assignable 通过指定名称过滤 org.example.SomeClass regex 通过正则表达式过滤 org\.example\.Default.* aspectj 通过aspectj表达式过滤 org.example..*Service+ --> <context:include-filter type="regex" expression="com.spring.ioc5.*"/> <context:exclude-filter type="annotation" expression="org.springframework.beans.factory.annotation.Autowired"/> </context:component-scan>
• Spring 支持以下4 种类型的过滤方式:
• 注解 org.example.SomeAnnotation 将所有使用SomeAnnotation 注解的类过滤出来
• 类名指定 org.example.SomeClass 过滤指定的类
• 正则表达式 com.kedacom.spring.annotation.web..* 通过正则表达式过滤一些类
• AspectJ 表达式 org.example..*Service+ 通过AspectJ 表达式过滤一些类
Spring3的基于注解实现Bean依赖注入支持如下三种注解:
- Spring自带依赖注入注解: Spring自带的一套依赖注入注解;
- JSR-250注解:Java平台的公共注解,是Java EE 5规范之一,在JDK6中默认包含这些注解,从Spring2.5开始支持。
- JSR-330注解:Java 依赖注入标准,Java EE 6规范之一,可能在加入到未来JDK版本,从Spring3开始支持;
- JPA注解:用于注入持久化上下文和尸体管理器。
@Required
@required
public setName(String name){}
@ required 负责检查一个bean在初始化时其声明的 set方法是否被执行, 当某个被标注了 @Required 的 Setter 方法没有被调用,则 Spring 在解析的时候会抛出异常,以提醒开发者对相应属性进行设置。 @Required 注解只能标注在 Setter 方法之上。因为依赖注入的本质是检查 Setter 方法是否被调用了,而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非 setXxxx() 类型的方法则被忽略。
@Autowired 采用byType的方式
@Autowired
private ISoftPMService softPMService;
@Autowired(required=false)
构造器、字段、方法
@Autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。与@Resource 的区别在于,@Resource 允许通过bean 名称或bean 类型两种方式进行查找@Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时, 才会使用new SoftPMServiceImpl();
@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。
@Autowired 还有一个作用就是,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。
@Qualifier 和@AutoWired联合使用,自动装配的策略就变成byName
使用@Autowired 时,如果找到多个同一类型的bean,则会抛异常,此时可以使用 @Qualifier("beanName"),明确指定bean的名称进行注入,此时与 @Resource指定name属性作用相同。
@Qualifier(value = "限定标识符")
字段、方法、参数
缺省的根据Bean名字注入:最基本方式,即缺省情况下使用Bean标识符注入
@Autowired
@Qualifier(value = "mysqlDataSource2") //指定Bean限定标识符
public void initDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
扩展@Qualifier限定描述符注解:对@Qualifier的扩展来提供细粒度选择候选者;
如果我们有两个数据源,分别为Mysql和Oracle,因此注入两者相关资源时就牵扯到数据库相关,如在DAO层注入SessionFactory时,当然可以采用前边介绍的方式,但为了简单和直观我们希望采用自定义注解方式。
1. 扩展@Qualifier限定描述符注解来分别表示Mysql和Oracle数据源
/** 表示注入Mysql相关 */
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Mysql {
}
/** 表示注入Oracle相关 */
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Oracle {
}
@Autowired
public void initDataSource(@Mysql DataSource mysqlDataSource, @Oracle DataSource oracleDataSource) {
this.mysqlDataSource = mysqlDataSource;
this.oracleDataSource = oracleDataSource;
}
Assert.assertEquals(ctx.getBean("mysqlDataSourceBean"), testBean33.getMysqlDataSoruce());
Assert.assertEquals(ctx.getBean("oracleDataSource"), testBean33.getOracleDataSoruc
2.扩展参数的注解
package cn.javass.spring.chapter12.qualifier; public enum DataBase { ORACLE, MYSQL; } @Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface DataSourceType { String ip(); //指定ip,用于多数据源情况 DataBase database();//指定数据库类型 } @Autowired public void initDataSource( @DataSourceType(ip="localhost", database=DataBase.MYSQL) DataSource mysqlDataSource, @DataSourceType(ip="localhost", database=DataBase.ORACLE) DataSource oracleDataSource) { this.mysqlDataSource = mysqlDataSource; this.oracleDataSource = oracleDataSource; } Assert.assertEquals(ctx.getBean("mysqlDataSourceBean"), testBean34.getMysqlDataSource()); Assert.assertEquals(ctx.getBean("oracleDataSource"), testBean34.getOracleDataSoruce());
3. 自定义注解限定描述符:完全不使用@Qualifier,而是自己定义一个独立的限定注解;
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface CustomQualifier { String value(); } @Autowired public TestBean35(@CustomQualifier("oracleDataSource") DataSource dataSource) { this.dataSoruce = dataSource; }
在Spring配置文件中注册CustomQualifier自定义注解限定描述符,只有注册了Spring才能识别:
<bean id="customAutowireConfigurer" class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">
<property name="customQualifierTypes">
<set>
<value>cn.javass.spring.chapter12.qualifier.CustomQualifier</value>
</set>
</property>
</bean>
@Value
用于注入SpEL表达式,可以放置在字段方法或参数上
@Value(value = "SpEL表达式")
字段、方法、参数
1、可以在类字段上使用该注解:
- @Value(value = "#{message}")
- private String message;
2、可以放置在带@Autowired注解的方法的参数上
- @Autowired
- public void initMessage(@Value(value = "#{message}#{message}") String message) {
- this.message = message;
- }
3、还可以放置在带@Autowired注解的构造器的参数上:
- @Autowired
- private TestBean43(@Value(value = "#{message}#{message}") String message) {
- this.message = message;
- }
@Lazy
定义Bean将延迟初始化
- @Component("component")
- @Lazy(true)
- public class TestCompoment {
- ……
- }
@DependsOn
定义Bean初始化及销毁时的顺序
- @Component("component")
- @DependsOn({"managedBean"})
- public class TestCompoment {
- ……
- }
@Scope
定义Bean作用域,默认单例
- @Component("component")
- @Scope("singleton")
- public class TestCompoment {
- ……
- }
@Primary
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
- @Component("component")
- @Primary
- public class TestCompoment {
- ……
- }
@Configuration
注解需要作为配置的类,表示该类将定义Bean配置元数据,@Configuration注解的类本身也是一个Bean,因为@Configuration被@Component注解了,因此@Configuration注解可以指定value属性值,如“ctxConfig”就是该Bean的名字,如使用“ctx.getBean("ctxConfig")”将返回该Bean。
- @Configuration("ctxConfig")
- public class ApplicationContextConfig {
- //定义Bean配置元数据
- } </span>
@Bean
注解配置类中的相应方法,则该方法名默认就是Bean名,该方法返回值就是Bean对象,并定义了Spring IoC容器如何实例化、自动装配、初始化Bean逻辑
- @Bean(name={},
- autowire=Autowire.NO,
- initMethod="",
- destroyMethod="")
- name:指定Bean的名字,可有多个,第一个作为Id,其他作为别名;
- autowire:自动装配,默认no表示不自动装配该Bean,另外还有Autowire.BY_NAME表示根据名字自动装配,Autowire.BY_TYPE表示根据类型自动装配;
- initMethod和destroyMethod:指定Bean的初始化和销毁方法。
@Import
类似于基于XML配置中的<import/>,基于Java的配置方式提供了@Import来组合模块化的配置类
- @Configuration("ctxConfig2")
- @Import({ApplicationContextConfig.class})
- public class ApplicationContextConfig2 {
- @Bean(name = {"message2"})
- public String message() {
- return "hello";
- }
- }
JSR-250注解@Resource
自动装配,默认根据类型装配,如果指定name属性将根据名字装配,可以使用如下方式来指定
- @Resource(name = "message")
- private String message;
- @Resource注解应该只用于setter方法注入,不能提供如@Autowired多参数方法注入;
- @Resource在没有指定name属性的情况下首先将根据setter方法对于的字段名查找资源,如果找不到再根据类型查找;
- @Resource首先将从JNDI环境中查找资源,如果没找到默认再到Spring容器中查找,因此如果JNDI环境中有和Spring容器同名的资源时需要注意。
@PostConstruct和PreDestroy:通过注解指定初始化和销毁方法定义;
类似于通过<bean>标签的init-method和destroy-method属性指定的初始化和销毁方法,但具有更高优先级,即注解方式的初始化和销毁方法将先执行。
• @PostConstruct在方法上加上注解@PostConstruct ,这个方法就会在Bean 初始化之后被Spring 容器执行(注:Bean 初始化包括,实例化Bean ,并装配Bean 的属性(依赖注入))。
• @PreDestroy 在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。
JSR-330注解
@Inject:等价于默认的@Autowired,只是没有required属性;
@Named:指定Bean名字,对应于Spring自带@Qualifier中的缺省的根据Bean名字注入情况;
@Qualifier:只对应于Spring自带@Qualifier中的扩展@Qualifier限定描述符注解,即只能扩展使用,没有value属性。
相关推荐
Spring Ioc 注解 依赖注入
Spring通过注解实现IOC,Spring通过注解实现IOC,Spring通过注解实现IOC
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
简单手写的springIOC容器注解模式,仅供参考,欢迎指教。
Spring IoC简单示例,使用注解配置依赖注入,使用Maven构建项目 Maven使用及SpringIoC教程参考我的Blog:http://blog.csdn.net/boyazuo
压缩包中使用Java中的Spring框架的注解方式来实现IoC的操作
使用反射技术和注解类实现手写SpringIOC,并使用SpringJDBC进行依赖注入测试。
SpringIoC和DI注解开发.pdf
迷你书是《Spring揭秘》的精选版,节选了原书中介绍Spring IoC容器的6个章节。《Spring揭秘》以幽默生动的语言、辅以有趣的故事和典故,循循善诱地...6.1 Spring 2.5的基于注解的依赖注入 6.2 Spring 3.0展望 6.3 小结
基于注解的IOC配置,Spring整合Junit_特别适合新手学习。
Spring简单介绍,AOP IOC Bean 常用注解
SpringIOC、注解的解析过程、自定义注解、Aop等相关的详细说明
spring ioc 采用注解方式实现Bean实例化和依赖注入
Java-Spring-SpringIoC容器-SpringIoC的学习 SpringIoC容器的学习笔记 主要介绍了IoC容器工作原理以及如何配置IoC容器 通过标签和注解配置容器
day2-Spring IOC 和 DI 注解开发.md
基于java实现的类似spring自动装配的代码。
主要给大家介绍了Spring IOC基于注解启动的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
Spring注解IOC所用的jar包
自己实现的简易的模拟Spring的IoC容器,实现注解自动装配
SpringIOC的具体实现代码可以配合着博客做参考 这个Demo中主要使用的是注解配置