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;
}
自动装配模式区别
- 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
构造方法区别和设置注入区别
- 设置注入支持大部依赖注入,但基本类型,用默认值不要用设置注入;
构造方法不支持大部分依赖注入,必须要正确传入构造参数,否则报错
2.设置注入不重写构造方法的值,属性注入在实例化之后。 同时使用设置方法和构造方法,构造方法不能覆盖设置方法注入的值
3.设置注入不能保证某种依赖已被注入,存在对象的依赖关系不完整; 构造方法注入不允许依赖关系生成不完整的对象。
- 设置注入时如果A B两个对象互相依赖,A对象创建时spring 抛sObjectCurrentlyInCreationException异常, 因为B 创建前A 是不能被创建的。spring 用设置方法解决循环依赖问题,因为属性注入在实例化之后,确保依赖的对象已实例化。