注解形式配置应用IOC
在类定义、方法定义、成员变量定义前使用,格式:@注解标记名
理解与回顾:
使用Spring IOC 管理对象(定义bean、bean的控制(scope/init-method等属性))及对象关系(DI: set注入/构造器注入)。
控制反转:改变了对象获取方式。 new方式获取 --> spring容器创建对象之后注入进来使用。降低了耦合。
1. 组件自动扫描
指定包路径,将包下所有组件进行扫描,组件类定义前有注解标记则会扫描到Spring容器。
基于注解的组件扫描方式:
- 开启组件扫描
spring.xml
...
<context:component-scan base-package="org.***" />
...
- 组件前添加注解
- 扫描标记注解:
@Component //其他组件
@Controller //控制层
@Service //业务层组件 xxxService
@Repository //数据访问层组件 xxxDao - 对象管理注解:
@Scope
@PostConstruct
@PreDestroy - 举例:
@Component("idName") //扫描ExampleBean 组件,默认id=exampleBean
//@ComponentScan // 注解方式开启组件扫描
@Scope("singleton") // 等价于<bean scope="">,默认单例。
public class ExampleBean {
@PostConstruct //等价于<bean init-method="" >
public void init() {
System.out.println("初始化逻辑");
}
@PreDestroy // 等价于<bean destroy-method="" >
public void destroy() {
System.out.println("释放资源,释放spring容器对象资源,触发单例对象的destroy-method");
}
public void excute() {
System.out.println("do sth");
}
}
2. 组件依赖:为bean添加注解,实现自动注入
-
@Resource:由JDK提供,可以定义在变量前或者setXXX方法前。
-
@Autowired:由Spring提供,可以定义在变量前或者setXXX方法前。
二者都可以实现注入,不存在多个匹配类型,使用Resource和Autowired都可以。
如果存在多个匹配类型,可以按名称注入:
@Resource(name="指定名称") 或
@Autowired
@Qualifier("指定名称") -
举例:
@Component
public class Student {
//需要调用Computer和Phone对象
@Autowired
private Computer c; //注入Computer对象
//使用注解set方法也可省略,xml的配置方式不能省略(set注入方式)
//public void setC{
// this.c = c;
//}
@Autowired(required=false) // 设置required属性为false,会尝试自动注入,若没有匹配的bean,则未注入,p仍为null。
//@Qualifier("p") //指定名称注入
private Phone p; //注入Phone对象
...
}
- @Autowired或@Resource是对象的注入,简单值可以用@Value("#{id.key}")注入(表达式注入)。
举例:
xxx.properties
username=root
password=123456
spring.xml
<util:properties id="db" location="classath:xxx.properties">
</util:properties>
3. Spring IOC应用小结
三种配置方案:1. xml中显示配置; 2. java中显示配置; 3. 组件扫描,自动注入。
自己写的组件用简洁的注解方式自动注入(装配)即可;
第三方组件无法在其类上添加@Component和@AutoWired注解,必须用XML或JavaConfig 显式配置。
总之,以注入方式成全对象依赖关系,实现了组件解耦。