前面讲的Bean相关配置全部是使用xml配置文件或实现接口来实现的,接下来将比较常用的用法,使用注解实现bean的注入和管理
内容包括
- ClassPath扫描与组件管理
- 类的自动检测与注册bean
- context:annotation-config
- @Component、@Repository、@Service、@Controller
- @AutoWired、@Required
- @Qualifier
- @Configuration、@Bean
- @ImportResource("")、@Value
- @Resource
ClassPath扫描与组件管理
从spring3.0开始可以使用java注解来定义bean,而非xml,如@Configuration、@Bean、@Import、@DependsOn
@Conponent是一个通用注解,可用于任何Bean
@Repository DAO层(持久层)注解
@Service Service层(服务层)注解
@Controller MVC控制层注解
注册在类上的注解,可以被spring自动检测并注册到ApplicationContext中,注册在成员变量或方法上的注解可以被自动装载
类的自动检测
1、以下语句需要在springxml中配置,即可使用注解
context:annotation-config
context:component-scan(一般配置此配置,配置检测路径,会包含annotation-config)
2、使用过滤器进行自定义扫描
默认情况下,类被自动发信并注册bean的条件是:使用@Component、@Repository、@Service、@Controller注解或使用@Component注解的自定义注解
可使用过滤器修改扫描规则,如用某字符替换某注解,context:include-filter、context:exclude-filter、ues-default-filter(禁用自动发现与注册)
filter类型(type)
- annotation 注解
- assignable 类
- aspectj
- regex 正则表达式
- custom
Demo
1、修改xml文件
2、在需要注册的类上做注解(这里注解只能自动注册类,省去了xml配置,但不能自动装载,还是需要通过ApplicationContext获取)
service中的dao类,因为有构造,可以自动装载,若无构造,需使用autowired
3、测试运行
@AutoWired、@Required——自动装载bean
AutoWired可以注解成员变量,使其自动装载(不用使用构造)
当装载List时,会装载所有List泛型类型的类,若想使其有序,可使用@Order注解所有泛型类型的实现类,用1,2,3标记
若注解必须找到实现类,则可使用@Autowired(required = true) 或@Required(set方法注解)
@Qualifier——缩小范围
定义扫描的实现类名称,即使有其他实现类,也可以只装配该类
Qualifier——适用于成员变量,构造,多参方法
Resource——适用于成员变量,单参setter
@Bean基于Java的容器注解
使用在xml中配置bean标签的方式可以将类注册到ioc容器中;使用@Configuration注解+@Bean注解可以实现同样的效果
@ImportResource("")、@Value——资源引用
如jdbc的配置引入,可在Configuration文件上引入资源,然后对成员变量进行Value注解,读取资源文件中的key对于的值,再使用@Bean注册
如@ImportResource("classpath:/com/shane/spring/properties-config.xml")、@Value("${jdbc.url}")、@Value("${jdbc.username}")、@Value("${jdbc.password}")
@Resource、@PostConstruct、@PreDestory
@Resource使用与@Autowired差不多,有以下区别
1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2、@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false
3、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配
@Inject——需要引入包,等效于Autowired,与@Named配合使用