1.spring中的IOC应用
1.1 IOC是控制反转,核心要素是控制什么以及反转什么。
1.2 IOC实现的方式:依赖注入以及依赖查找。
1.3 spring IOC是一容器用于管理Bean的创建,销毁以及依赖关系;其中IOC控制的Bean的创建,销毁以及依赖查找,并将设计好的对象交由容器控制;IOC反转是将Bean的控制权(创建,销毁以及查找依赖)交给容器控制。
1.4 DI:依赖注入,注入方式包括:接口注入,setter注入(通过setter方法注入属性),构造注入(通过构造方法注入属性),名称空间注入(Spring中的一种实现注入的方式,依赖于setter注入或者构造注入, 依赖于setter注入的实现时P名称空间注入,依赖于构造注入的实现是C名称空间注入)
1.5 spring管理Bean的方式:
一。通xml配置文件管理Bean,
二。注解(通XML配合使用,在xml配置文件中开启注解扫描 ,列如:第一步 : 指定扫描的包,该配置自动开启注解,即 可以省略配置<context:component-scan package="com" /> <context:annotation-config/> 第二步:使用 @Component,@Repository,@Service,@Controller等注解注册Bean
@Repository //注册Bean
public class IndexDao {
public void query(){
System.out.println("query");
}
}
),
三。Java Configuration(与xml,注解配合使用,
@Configuration //声名为配置类
@ComponentScan("com") //指定扫面的包
@ImportResource("classpath:spring.xml") //指定配置文件
public class AppConfig {
})
1.6 spring初始化容器的三种方式:
一。根据类路径xml配置文件初始化容器:ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml-path")
二。根据Java Configuration配置类初始化容器:ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml-path")
三。根据外部xml配置文件初始化容器:FileSystemXmlApplicationContextcontext = new FileSystemXmlApplicationContext("xml-path")
1.7 Spring中Bean名称的生成策略
默认的生成策略
使用xml注册Bean
有id时,Bean名称默认与id一致,
无id时,默认使用类名首字母小写作为Bean名称
使用注解注册Bean
显式的指定Bean名称
不指定时,默认采用类名首字母小写作为Bean名称
1.8 spring中bean的作用域
当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:
-
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
-
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
-
request(http请求):对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
-
session(会话):对于每次HTTP Session,使用session定义的Bean都会产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
-
globalsession(全局会话):每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。
如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。
先看看spring的bean作用域有几种,分别有啥不同。 spring bean作用域有以下5个: singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理; prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理; ====下面是在web项目下才用到的=== request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听 session:每次会话,同上 global session:全局的web域,类似于servlet中的application 为什么spring要默认是单例呢?原因有二: 1、为了性能。 2、不需要多例。 1.9 spring中bean的生命周期
1-2:创建实例;
现在假设spring就是个容器,而配置文件中配置的bean属性才是我们真正需要的东西。创建实例就是说,我把配置文件中的bean信息取出来化作一个真正的bean并放到容器中。
3-4:注入依赖关系;
第3步是创建实例之后对实例作了一些处理,第4步是把xml中配置的bean属性值赋予给容器中的实例化之后的bean。
5:bean初始化之前的处理;
应用开发者需要把容器中实例化的bean拿出来用,这个拿出来的过程就是初始化(注意实例化与初始化的区别,instantiation 和initialization),第五步就是在初始化之前,对已经实例化的bean再作一定的处理。
6,7:初始化。
如果bean实现了InitializingBean,那么将调用InitializingBean的afterPropertiesSet()方法做一些初始化处理。如果没有实现InitializingBean,而是在配置文件中定义了init-method属性值,那么系统会找到init-method对应的方法并执行之,程序猿哥哥一般在这个方法里写一些初始化操作;
8:bean初始化之后的处理。
初始化之后在这个方法中再对bean进行修饰装点。
9,10:交给应用开发人员处理;
如果在<bean>中指定Bean的作用范围是scopt="prototype",那么系统将bean返回给调用者,spring就不管了(如果两个实例调用的话,每一次调用都要重新初始化,一个实例的修改不会影响另一个实例的值。如果指定Bean的作用范围是scope="singleton",则把bean放到缓冲池中,并将bean的引用返回给调用者。这个时候,如果两个实例调用的话,因为它们用的是同一个引用,任何一方的修改都会影响到另一方。)
11.bean用完之后;
对于scope="singleton"的bean,使用完之后spring容器会做一些处理,比如编写释放资源、记录日志等操作。
12.销毁;
调用配置文件中的销毁方法销毁实例
2.spring中的AOP应用
1.1 AOP是基于动态代理实现的, 可以 通过AOP来实现日志监听,事务管理,权限控制等等 ,spring aop是面向切面编程,就是在你的原有项目功能上,通过aop去添加新的功能,这些功能是建立在原有的功能基础上的,而且不会修改原来的动能代码以及功能逻辑。
1.2 Spring aop的实现机制是横向抽取机制,所谓的横向抽取机制就是使用动态的代理的方式(cglib代理和jdk代理)来实现对象的代理,实际上我们操作的是假对象。既然有横向抽取机制,那么有没有纵向代理模式呢 ?答案是有的。纵向抽取就是把公共的方法写在父类里,所有的类都继承父类,这样就是能调用父类的方法即子类继承父类并调用父类的方法就是纵向抽取。
1.3 spring aop是通过xml文件配置方式或者是使用注解的方式实现的