隐式的Bean发现机制和自动装配
基于注解的IoC配置
与在xml中配置目的是一样的,都是降低代码之间的耦合度的,只是配置的形式不一样。
使用注解的步骤:
1、添加context的名称控件和约束
2、开启注解扫描:由spring扫描指定的包及其子包下的所有类,如果类上使用了@Component注解,就将该类装配到容器中
3、在类上使用@Component注解
使用注解之前一定要先开启注解扫描
<!-- 配置注解扫描的包:声明到指定的包下去进行扫描,如果发现类上有对应的注解,将其装配到容器中 -->
<context:component-scan base-package="com.demon"/>
一、使用注解装配bean
1.1 @Component
作用:在类上面使用该注解,把资源让spring来管理。相当于在xml中配置了一个bean
属性:value:指定bean的id。如果不指定value属性,默认bean的id是当前类的类名,首字母小写。
/**
* @Component注解:相当于配置了<bean>标签
* value = "util":相当于配置了bean标签的id属性,单独配置value时,可以省略value属性名称。
*/
@Component(value="util")
public class Util {
}
1.2 @Controller
一般用于表现层的注解。用法与@Component相同
1.3 @Service
一般用于业务层的注解。用法与@Component相同
1.4 @Repository
一般用于持久层的注解。 用法与@Component相同
详解
对于DI使用注解,将不再需要在Spring配置文件中声明Bean实例。Spring中使用注解,需要在原有Spring运行环境基础上再做一些改变,完成以下三个步骤。
(1)导入AOP的Jar包。因为注解的后台实现用到了AOP编程。
(2)需要更换配置文件头,即添加相应的约束。
(3)需要在Spring配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
1、定义Bean@Component
需要在类上使用注解@Component,该注解的value属性用于指定该bean的id值。
举例:di01
另外,Spring还提供了3个功能基本和@Component等效的注解:
@Repository 用于对DAO实现类进行注解
@Service 用于对Service实现类进行注解
@Controller 用于对Controller实现类进行注解
之所以创建这三个功能与@Component等效的注解,是为了以后对其进行功能上的扩展,使它们不再等效。
2、Bean的作用域@Scope
需要在类上使用注解@Scope,其value属性用于指定作用域。默认为singleton。
举例:di01
3、基本类型属性注入@Value
需要在属性上使用注解@Value,该注解的value属性用于指定要注入的值。
使用该注解完成属性注入时,类中无需setter。当然,若属性有setter,则也可将其加到setter上。
4、按类型注入域属性@Autowired,@Autowired是spring的注解
需要在域属性上使用注解@Autowired,该注解默认使用按类型自动装配Bean的方式。
使用该注解完成属性注入时,类中无需setter。当然,若属性有setter,则也可将其加到setter上。
5、按名称注入域属性@Autowired与@Qualifier
需要在域属性上联合使用注解@Autowired与@Qualifier。@Qualifier的value属性用于指定要匹配的Bean的id值。同样类中无需setter,也可加到setter上。
@Autowired还有一个属性required,默认值为true,表示当匹配失败后,会终止程序运行。若将其值设置为false,则匹配失败,将被忽略,未匹配的属性值为null。
6、域属性注解@Resource,也就是说@Resource是java自带的注解
Spring提供了对JSR-250规范中定义@Resource标准注解的支持。@Resource注解既可以按名称匹配Bean,也可以按类型匹配Bean。使用该注解,要求JDK必须是6及以上版本。
(1)按类型注入域属性
@Resource注解若不带任何参数,则会按照类型进行Bean的匹配注入。
举例:di04
(2)按名称注入域属性
@Resource注解指定其name属性,则name的值即为按照名称进行匹配的Bean的id。
举例:di05
除了@Autowired之外,@Resource也是常用的手段
其中,在Java代码中可以使用@Autowired或@Resource注解方式进行Spring的依赖注入。两者的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。
比如:我们用@Autowired为上面的代码UserDAO接口的实例对象进行注解,它会到Spring容器中去寻找与UserDAO对象相匹配的类型,如果找到该类型则将该类型注入到userdao字段中;
如果用@Resource进行依赖注入,它先会根据指定的name属性去Spring容器中寻找与该名称匹配的类型,例如:@Resource(name="userDao"),如果没有找到该名称,则会按照类型去寻找,找到之后,会对字段userDao进行注入。
通常我们使用@Resource。
使用注解注入依赖对象不用再在代码中写依赖对象的setter方法或者该类的构造方法,并且不用再配置文件中配置大量的依赖对象,使代码更加简洁,清晰,易于维护。
在Spring IOC编程的实际开发中推荐使用注解的方式进行依赖注入。
7、Bean的生命始末@PostConstruct与@PreDestroy
在方法上使用@PostConstruct,与原来的init-method等效。在方法上使用@PreDestroy,与destroy-method等效。