Spring实战之Bean的自动装配和检测

  • Bean的自动装配:让spring自动识别如何装配Bean的依赖关系

自动装配的四种策略:

 

类型

策略

举例

byName

把与Bean属性具有相同名字的其他Bean自动装配到Bean的对应属性中,没有匹配的不装配

class="com.spring.demo.DemoBean"    autowire="byName">

byType

把与Bean属性具有相同类型的其他Bean自动装配到Bean的对应属性中,没有匹配的不装配。spring提供两种装配设置,primary是true的优先装配,但该属性默认为true,所以设置了某个bean为优先装配时,需要将其他的bean的primary设置为false。若在自动装配时,希望排除某些bean,可以设置autowire-candidate为false

primary="false"/>

 

autowire-candidate=“false”/>

 

constructor

把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean的对应属性中,没有匹配的不装配。

autowire=“constructor”/>

autodetect

首先尝试constructor装配,如果失败,再使用byType装配

autowire=“autodetect”/>

注意:使用constructor自动装配策略时,必须让spring自动装配构造器的所有入参,不能混合使用constructor自动装配策略和元素。

使用注解装配之spring自带注解@Autowired:

spring容器默认禁用注解装配的。我们需要在spring的配置在启动它才可以基于注解的自动装配。元素表明使用基于注解的自动装配。

1.标注setter方法,使用注解就可以移除配置文件里对应的元素了

@Autowired
public void setDemoBean(DemoBean demoBean){
this.demoBean=demoBean
}

2.标注构造器

@Autowired
public DemoAnnotation(DemoBean demoBean){
this.demoBean=demoBean
}

3.标注自动装配Bean引用的任意方法

@Autowired
public void otherMethod(DemoBean demoBean){
this.demoBean=demoBean
}

4.直接标注属性,并删除setter方法

@Autowired
private DemoBean demoBean;

关于@Autowired使用的注意点:

1.装配时没有匹配的Bean,会抛出NoSuchBeanDefinitionException异常,比如有时候属性不一定必须要装配,可以为null,设置@Autowired的required属性为false,装配时如果没有找到匹配的Bean会设为null。

@Autowired(required=false)
private DemoBean demoBean;

2.匹配到多个Bean时,使用@Qualifier注解装配指定Id的Bean。

@Autowired
@Qualifier(“demoId”)
private DemoBean demoBean;

3.构造器装配,只能有一个Bean的构造器可以将@Autowired的required属性设置为true,其他的需设置为false。

使用注解装配之@Inject:

@Inject与@Autowired一样,只是@Inject没有@required属性,因此@Inject标注的依赖关系必须存在,否则会抛出异常。

相对于@Autowired对应的@Qualifier,@Inject对应的是@Named

@Autowired
@Name(“demoId”)
private DemoBean demoBean;
  • Bean的自动检测:让spring能自动识别哪些类需要配置成Spring Bean,从而减少对元素的使用。配置spring的自动检测,需要使用元素。




 

元素会扫描指定的包及其子包,并查找出能自动注册为spring  bean的类。但是问题来了:是如何确定哪些类需要注册为spring Bean呢?

基于注解的自动检测:

默认情况下,查找使用构造型注解所标注的类。

  • @Component:通用的构造器注解,标识该类为spring组件。

  • @Controller: 标识该类定义为SpringMVC的controller

  • @Repository:标识该类定义为数据仓库

  • @Service: 标识该类为服务类

可以通过平配置,并使用@Component注解标注DemoBean,来消除显示的定义。

package com.spring.demo;
import org.springframework.stereotype.Component;
@Component
//如果要指定bean的Id,可以在注解上直接指定如:@Component(“defaultBean”)
public class DemoBean{
//省略
}

spring扫描com.spring.demo包时,会发现使用@Component注解所标注的类DemoBean,并自动将它注册为Spring Bean。Bean的Id默认为无限定类名:demoBean,如果要指定bean的Id,可以在注解上直接指定如:@Component(“defaultBean”)。

组件扫描的自动检测:

通过为配置或者子元素,自动注册所有实现某spring bean接口的实现类。



 

的type和expression属性一起来协作定义组件扫描策略。所有派生于Instrument的所有类自动注册为spring Bean。而来告知spring哪些类不需要注册为Spring bean。

 

 

 

 

 

 

 

你可能感兴趣的:(IT相关,读书分享,学习总结)