1.spring为了降低java开发的复杂性,采取了4种关键策略:
- 基于pojo的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式样板式代码
2.如果一个对象只通过接口而不是具体的实现或初始化过程来表明依赖关系,name这种依赖就是能够在对象本身毫不知情的情况下,用不同的具体实现进行替换
public class aa implements bb {
private Quest quest ;
public aa(Quest quest){
this.quest = quest
}
public void lala(){
quest.embak();
}
}
3.创建组件之间的行为通常称为装配,如采用xml方式,<bean><constructor-arg ref='aa'/></bean>
或使用java来描述配置:
@configuration
@bean
4.spring 通过应用 上下文(application context)来装载 bean,上下文负责对象的创建和组装,spring自带了多种上下文的实现,他们的区别在于如何加载配置,创建应用对象之间的协作关系的行为通常称为装配,也就是依赖注入,,spring提供了三种主要的装配机制:
- xml显式
- java中进行显式配置
- 隐式的bean发现机制和自动装配
5.spring够自动化装配,那何苦要要显示的将这些bean装配在一起呢?
比如想要将第三方的组件装配到你的应用中,这种情况是没有办法在他的类上上添加注解的,或者是将配置文件中的内容引入你应用中也需要显式装配
6.如何创建可被发现的bean?
- 在实现类上注解@component注解,在另外一个类上注解@configuration和@componentScan注解,xml方式:<context:component-scan base-package=""/>
- 为组件扫描的bean命名
默认spring的bean命名方式是类名的第一个字母变小写,也可以指定bean的名称@component("name"),也可以使用@Named("name"),@named注解不常用.
- 设置组件扫描的基础包
@componentScan(basepages={"",""})
@componentScan(baseClasses={.class,.class})
- 通过为bean添加注解实现自动装配
@Autowired,注意应用上下文在创建的时候,如果没有匹配到bean,spring会抛出一个异常,为了避免异常的出现,可以在@Autowired的required的属性设置为false;但是如果没有进行null检查,可能会出现空指针
也可以使用java规范的@Inject注解,
7.通过java代码来装配bean
使用java来配置而不是xml是因为java更强大,并且安全,对重构友好
@configuration
@bean
8.通过xml进行装配
只作了解:<bean id="aaa" class = "xxx.xx"></bean> //指定全限定名,并且指定名称
构造器引入bean :<bean><constructor-arg ref=""></bean>
c命名空间:<bean id="aa" class= "" c:cd-ref = ""></bean>
还有p属性注入命名空间........
9..导入和混合配置
- 在javaconfig中引用xml:@configuratin @import(.class)@ImportResouce("classPath:xxx.xml")
高级装配bean
1.环境与profile
@profile注解指定某个bean属于哪一个profile,并且确保对应的profile处于激活的状态
如@profile("dev"),只要在规定的profile激活时,相应的bean才会被创建
xml中也可以配置profile:<bean profile="dev"></bean>
注意:spring在确定哪个profile处于就激活状态时,需要依赖于active和default.优先级是active>default,如果都么有配置,那么spring只会创建那些没有定义profile的bean
如:@activeprofile("dev")
2.条件化的bean
@conditional(xxx.class),返回true和false,true才继续执行
3.处理自动装配的歧义性
如果有多个bean的话 ,spring创建上下文时候无法做出选择,会抛异常
- primary首选bean,@compent @primary
- @qualifier限定自动转配的bean,进一步缩小范围,@Qualifier("xxx")
- 当需要在一个类中引入多个通用的bean,可以使用自定义的限定符注解,可以使用注解的方式
4.bean的作用域
84