Spring 自动装配

208 阅读3分钟

Spring 的几种配置方式:

1. 基于Xml 的配置

2. 基于注解的配置

3.基于java的配置

基于Java 的配置spring

@Bean 实例化/配置/初始化对象,交给spring IoC容器管理

@Configuration 声明的类在同一个类内部 通过@Bean 设置嵌入bean 依赖关系,


@Configuration @ComponentScan(basePackages = "com.somnus") public class AppConfig {

@Bean



public MyService myService(){



return new MyServiceImpl();



} .}




public static void main(String[] args) { 



ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);



MyService myService = ctx.getBean(MyService.class); 



myService.doStuff(); }

基于注解方式配置spring

注解装配开启在spring 文件中配置:

在spring中向属性 方法 构造方法中用注解自动装配变量

常用注解:

@Autowired @Required @Qualifier @JSR-250 Annotations:

Spring 基于支持JSP-250注解,有以下注解:

@Resource 

@PostConstruct 

@PreDestory

spring 自动装配

spring 通过Bean Factory 注入方式自动配置bean之间的依赖关系。

自动装配两种方式:
1. bean 配置文件中,根据名称把bean设置自动装配

<bean id = "empDao" class= "com.EmployeeDaoImpl" autowaire="byName"></bean>

2. @Autowaire 注解自动装配

使用注解前,在配置文件配置才可用

<context:annotation-config/>

或者

bean class = "org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"

然后注解使用





@Autowaire




public EmployeeDaoImpl (EmployeeManager manager)



{




this.manager = manager;




}

自动装配模式区别

  1. no : spring 框架中 默认设置是关闭的。开发要自行在bean 定义中用标签设置依赖关系

2.byType : 当在一个bean 自动装配一个属性时,容器根据bean 类型自动在配置文件找一个匹配的bean,

如果没找到就报错。

2.byName: 当在一个bean 自动装配一个属性时,容器根据bean 名称自动在配置文件找一个匹配的bean,

如果没找到就报错。

3.constructor:构造器和byType 类似,仅适用有构造器相同参数的bean,没找到构造器相同的参数类型会报错

4.autodetect

自动探测使用构造器模式还是byType 模式,如果找到满足构造器带参的就用构造器,如果没找到带参或无参构造器的,容器自动选择byType 自动装配。

常用注解

@Required: 验证所有bean是否按照上下文正确配置, 在set() 方法上加@Required 注解,

原理:在 IoC 容器注册

利用RequiredAnnotationBeanPostProcessor 后置处理验证被@Required注解过的Bean属性是否正确配置,否则抛出BeanInitializationException 异常

@Autowaire: 在设置方法setter()使用注解@Autowaire ,会尝试用byType 模式自动装配bean的属性;

或者在构造方法使用注解@Autowaire,创建bean时自动装配

@Qualifier : 当一个类有多个bean实例, 在 bean上属性使用@Qualifier("beanName") 指定beanName 通知spring 容器要装配哪个bean

构造方法区别和设置注入区别
  1. 设置注入支持大部依赖注入,但基本类型,用默认值不要用设置注入;

构造方法不支持大部分依赖注入,必须要正确传入构造参数,否则报错

2.设置注入不重写构造方法的值,属性注入在实例化之后。 同时使用设置方法和构造方法,构造方法不能覆盖设置方法注入的值

3.设置注入不能保证某种依赖已被注入,存在对象的依赖关系不完整; 构造方法注入不允许依赖关系生成不完整的对象。

  1. 设置注入时如果A B两个对象互相依赖,A对象创建时spring 抛sObjectCurrentlyInCreationException异常, 因为B 创建前A 是不能被创建的。spring 用设置方法解决循环依赖问题,因为属性注入在实例化之后,确保依赖的对象已实例化。