- Bean 定义及作用域的注解实现
- Classpath 扫描与组件管理
- 类的自动检测与注册 Bean
- <context: annotation-config/>
- @Component, @Repository, @Service, @Controller
- Autowired 注解说明
- @Required
- @Autowired
- @Qualifier
- @Resource
- 基于 Java 的容器注解说明
- Spring 对 JSR 支持的说明
<!--more-->
Bean 定义及作用域的注解实现Classpath 扫描与组件管理
- Spring3.0 开始,可以使用 Java 定义 Bean (以前使用XML)eg: Configuration, @Bean, @Import, @DependsOn
- @Component 是通用注解,可用于任何 Bean
- @Repository, @Service, @Controller 针对性注解
- @Repository 注解 DAO 类,即持久层
- @Service 通常注解 Service 类,即服务层
- @Controller 注解 Controller 类,即控制层(MVC)
元注解(Meta-annotations)
- 元注解:注解的注解,Spring 提供的注解可以作为自己的代码,即“元数据注解”
- 元注解可以应用到另一个注解中
- 元注解可以有其他属性,允许定制
类的自动检测及 Bean 的注册
- Spring 可以自动检测类并注册 Bean 到 ApplicationContext 中
注解在类,方法或者成员变量上都可以自动检测 - 为了能检测这些类并注册相应的 Bean,需要添加
‘<context: component-scan base-package="org.example">’ - <context: component-scan>包含<context: annotation-config>,使用前者后不使用后者,通常使用前者
<context: annotation-config/>配置介绍
- 配置在 Spring 的 XML 中
- 作用:仅会查找在同一个 applicationContext 中的 bean 注解
使用过滤器自定义扫描
- 使用过滤器修改注解扫描
- 可以使用 use-default-filters= "false" 禁用自动发现与注册
定义 Bean
- 扫描过程中组件被自动检测,Bean 的名称由 BeanNameGenerator 生成
-
自定义命名,实现 BeanNameGenerator 接口(包含无参构造器)
在 beans 中配置Bean 的作用域
- Spring2.5 提供标识scope的注解 @Scope
- 自定义 scope 策略,实现 ScopeMetadataResolver 接口(包含无参构造器)
在 beans 中配置
代理方式
- 使用 scoped-proxy 属性指定代理,三个值 no/interfaces/targetClass
Bean 定义和作用域实现例子(对应上一篇例子)
BeanAnnotation 类
package com.imooc.beanannotation;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
//@Component("bean")
@Scope
@Component
public class BeanAnnotation {
public void say(String arg) {
System.out.println("BeanAnnotation : " + arg);
}
public void myHashCode() {
System.out.println("BeanAnnotation : " + this.hashCode());
}
}
单元测试类
package com.imooc.test.beanannotation;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.imooc.beanannotation.BeanAnnotation;
import com.imooc.test.base.UnitTestBase;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestBeanAnnotation extends UnitTestBase {
public TestBeanAnnotation() {
super("classpath*:spring-beanannotation.xml");
}
@Test
public void testSay() {
BeanAnnotation bean = super.getBean("beanAnnotation");
bean.say("This is test.");
// bean = super.getBean("bean");
// bean.say("This is test.");
}
@Test
public void testScpoe() {
BeanAnnotation bean = super.getBean("beanAnnotation");
bean.myHashCode();
bean = super.getBean("beanAnnotation");
bean.myHashCode();
}
}
spring-beanannotation.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" >
<context:component-scan base-package="com.imooc.beanannotation"></context:component-scan>
</beans>
Autowired 注解说明
@Required
- @Required 注解适用于 Bean 属性的 setter 方法
- 受影响的 Bean 属性必须在配置时被填充
@Autowired
- 可以将 @Autowired 注解为“传统”的 setter 方法
- 可用于构造器或者成员变量 (用于成员变量或者 set 方法相当于设置注入,用于构造器相当于构造注入)
- 可以使用 @Autowired(required=false) 避免找不到合适的 bean
- 每个类只存在一个构造器 required=true
- @Autowired 的必要属性,建议使用 @Required 注解
-
可以使用 @Autowired 注解解析依赖性接口,可以直接获取 Spring 资源
eg:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher and MessageSource - 可以用于集合框架,为集合中所有 bean 注册,实现 org.springframework.core.Ordered 接口或者 @Order 注解使其有序(list)
注意:@Autowired 由 Spring BeanPostProcessor 处理,所以自己定义是不能使用该注解,可以供过 XML 或者 @Bean 注解加载
@Qualifier
- 按类型自动装备多个 Bean 实例,用于构造器参数或者方法参数或者成员变量
- 注解集合类型变量
注解使用
xml使用
@Resource(JSR-250 推荐使用)
- @Autowired 按 byType 自动注入,而 @Resource 默认按 byName 自动注入罢了
- @Resource 两个重要属性 name 和 type
- 需要在 xml 中加入
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
- @Bean 标识用于配置和初始化新对象 类似 xml 中<bean/>
- 使用 @Configuration 注解类 ,@Bean(name="")
参考文档
Spring 注解大全