控制反转IOC:程序员不本身去new实例,而是交由Spring去构建实例,而且统一放在IOC容器当中由Spring进行管理。java
依赖注入DI:即注入,由Spring将构建出的实例注入到须要使用这个对象的类当中。程序员
要让实例被构建并被交给Spring的IOC容器统一管理的几种实现方式:(大序号表示实例的构建方式,小序号表明bean的注入方式)web
1、Spring注入方式:经过在xml当中定义bean,而且配置加载ApplicationsContext的方式,分为两种,在xml当中定义了bean元素,并在其中设置了id属性以及class属性。app
a) 在使用到这个bean的类中加入同名属性,而且写出setter方法。框架
b) 在使用这个bean的类中加入同名属性,而且在这个类的构造器当中,有对这个属性的赋值操做函数
2、采用注解方式与自动扫描:例如直接在java代码当中使用SpringMVC框架下的:@Component元注解或者其定义的三大注解 @Service(用于Service层) @Controller(用于Controller类) @Repository(用于Dao层),以后不须要在xml当中显式的配置bean了,直接配置一个扫描,Spring会自动去构建这些类的实例工具
a) 使用@Autowired注解,直接从IOC容器当中拿到实例,@Autowired使用的三种方式测试
i. 在成员变量上ui
ii. 在setter函数上,函数内部对成员变量赋值this
iii. 在构造器上使用,构造器对成员变量赋值
b) @Required只能放在setter上
c) @Resource注解:使用规则基本上与@Autowired相同,@Resource 注解的特色是根据bean的id进行匹配,而@Autowired能够根据bean的类型进行匹配,详见第12点
3、注解方式:避免繁琐的XML配置,直接在java代码当中使用注解。包括@Configuration @Bean @Import @DependsOn。@Bean一般搭配@Configuration使用,等价于XML当中的bean元素与beans元素的配置项,代码以下
此时若是没有指定@Bean的name属性,则默认是函数名为这个bean的id
配置文件的引入,引入主要分为了在xml中定义bean的方式和在java代码中使用注解,详见第10点
Spring框架图
核心容器:
Bean
Core核心包和工具
Context上下文
SpEL (Spring表达式)
接口的概念
一个例子,Junit测试
IOC容器的初始化:ApplicationContext自己就是保存bean对象的容器,故容器自己的初始化,就是经过一系列的配置,将ApplicationContext进行初始化。
而配置ApplicationContext有三种方式:
1、使用classpath
2、使用本地文件系统中某个文件地址
3、(SpringMVC)web应用中用servlet类或者Listener类来初始化IOC容器
即容器在启动后会开始加载bean的配置,并完成bean的初始化。当bean被构建出来以后,将这些bean赋值到须要使用到的类当中去,这个过程就是注入 。
经常使用的两种注入方式详解:
设值注入:此时在InjectionServiceImpl这个类当中,必须有属性 injectionDAO ,同时也要有该属性的set方法,此时这个XML作的事情是建立一个InjectionDAOImpl类的对象并经过set赋值给injectionDAO属性
必须在InjectionServiceImpl当中有一个injectionDAO的属性
而且经过InjectionServiceImpl的构造器,进行InjectionDAO类型的赋值,将这个对象赋值给属性injectionDAO
自动装配
即在beans元素当中添加一个属性,default-autowire=”byName”。此时就不用在bean的定义当中定义嵌套加入property这个元素了,全部的嵌套bean加在将会自动完成
自动装配的几种方式
ResourceLoader
全部的 ApplicationContext都实现了 ResourceLoader 接口,故只要获取到一个ApplicationContext体系的类就可使用这个 getResource()这个函数了
使用getResource函数时的几种前缀
这里,直接实现 ApplicationContextAware接口,这里面有 ApplicationContext的setter函数,因此能够直接注入 ApplicationContext的对象 applicationContext,能够用它来调用getResource()函数
以上就是经过 aware接口来调用 getResource() 函数的方法
jdk1.5以后,使用注解能够将Bean注入到上下文的IOC容器中
Spring下将Bean注入到容器中:
@Service @Repository @Controller
以上三种都是由元注解@Component定义获得的,放在类之上
而@Autowired则是放在类的内部的属性之上,表示从IOC容器中获取到注入的Bean,并使用
基础典型配置
自动检测时的配置
Spring下,annotation-config 和 component-scan的不一样:
先说,annotation-config的工做模式:其自己是无论类的注入的,即便用者须要首先经过某种方式将类注入到IOC容器当中(例如使用XML配置的方式,或者其余注入方式)。以后使用这个配置,对已经注入的Bean进行下一步的管理,用于“激活”Bean,让已经注入了的Bean开始工做
而说到component-scan的工做方式,其自己有着和annotation-config同样的做用,同时它还须要扫描指定包下的类,看是否存在由元注解 @Component定义的类,若是有,则将其也同时注入到IOC容器当中
搭配过滤器使用扫描
Bean的做用域(Scope)
1.singleton单例模式,
全局有且仅有一个实例
2.prototype原型模式,
每次获取Bean的时候会有一个新的实例
3.request
request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
Autowired比Required更经常使用
特色:既能够用在成员变量上;又能够用在set函数上
@Autowired使用的三种方式:
1 放在成员变量上,直接注入
2 成员先声明,以后设置一个set函数,在set函数上使用@Autowired
3 在构造器内,对成员变量赋值,而且在构造器上用@Autowired进行定义
除了常见的Component元注解定义的三种注解外,其余的接口也能够经过注解的方式定义
对于接口类型,其实现类若是被@Component等关键字定义以后,则此时,若是存在接口自己的一个集合类,则会顺序注入该接口全部实现类的对象。List和Map皆是
若是须要顺序,则还可在实现类上采用关键字@Order进行注入,规定实现类对象被注入的顺序,例如
@Order(1)
@Order(2)
bean的名称=@Bean去注入的方法的名称
即,此时的bean的name为:myService
.
XML中定义bean的方式
java代码中使用注解的方式
使用@Configuration注解,将ConfigFile构建为bean
此时,只须要在xml的配置中指明 properties 静态文件的位置便可
使用 @ImportResource和@Value注解进行资源文件读取,注解方式
一个小坑:注意在使用@Value注入值的时候,若是是@Value(“${username}”),此时取的是当前操做系统的操做者名。为了区分因此通常使用@Value(“${jdbc.username}”)
@Resource 和@Autowired均可以写在setter上或者写在字段上
两者不一样之处在于:
l @Autowired属于Spring,默认按照类型装配
l @Resource属于J2EE,按照名称进行装配
按照名称查找和经过类型查找的不一样点
private UserDao userdao
名称查找:经过该userdao属性名称在容器中查找id为userdao的bean
类型查找:在容器中查找类型为UserDao类型的bean的实体
@Resource注解在字段上和在setter函数上的注入规则
1 @Resource()在字段上:
2 @Resource在setter上
private UserDao userdao
@Resource
private void setUserDao(Dao dao){
this.userdao=dao;
}
此时,首先查找是否存在名字为userdao的bean;若是没有,则继续查找IOC容器中是否存在类型为Dao的bean,而并非属性自己的类型
Aware的方式是若是你的类中须要Spring框架自己的一些资源,这时你确定不可以本身去初始化那些资源而后经过属性注入或者构造器注入的方式进行依赖注入,因此Spring提供了这种方式由Spring框架为你注入
Spring提供各类Aware接口。常见的有:
BeanFactoryAware
BeanNameAware
ApplicationContextAware
BeanClassLoaderAware
穿插在各个子功能模块当中的切面,在修改代码时,不须要深刻到各个模块中修改源码,省事
申明pointcut
执行全部的方法
单一的方法匹配
通知的配置
前置通知
后置通知
throwing指定可被传递的异常属性的参数名
最终通知
将切面定义一个父类接口,而且配置该实现类
Pointcut的实现类之一
afterthrowing 和 after只能执行一个
afterreturning通常是方法结束前的最后一行代码,不管方法是否正常结束,不管是否抛出异常都会执行after当中的代码
全部基于配置文件的aspect只支持单例模式