Spring容器的实例化的两种方式:
1、使用ApplicationContext加载配置文件(推荐使用本方法)
ApplicationContext ac = new ClassPathXmlApplicationContext(“com/demo/applicacionContext.xml”);配置文件在工程目录里或者ApplicationContext ac = new FileSystemXmlApplicationContext(“D:/applicationContext.xml”);配置文件在硬盘里2、applicationContext是BeanFactory的子类Resource re = new ClassPathResource(“com/demo/applicacionContext.xml”);配置文件在工程目录里BeanFactory bc = new XmlBeanFactory(re);Bean bean = bc.getBean("bean在配置文件的id名");或者Resource re = new FileSystemResource(“com/demo/applicacionContext.xml”);配置文件在硬盘里BeanFactory bc = new XmlBeanFactory(re);Bean bean = bc.getBean("bean在配置文件的id名");
IOC
Spring对Bean组建的管理
1、bean组建的创建时机默认随着容器创建。我们可以使用延迟加载机制(在对应的bean组件配置lazy-init="true")在getBean的时候创建。
或者使用批量延迟加载,在头文件后添加default—lazy-init="true"进行批量延迟。2、Bean的创建模式默认单例模式,当然也可以使用scope属性进行修改。
singleton:单例模式,每次返回同一个beanprototype:原型模式,每次返回一个新的beanrequest:仅限Web环境,生命周期和request相同
session:仅限Web环境,生命周期和session相同
global session:仅限Web环境,生命周期和application相同
3、Bean对象的初始化和销毁init-method:用于指定初始化方法destroy-method:用于指定销毁方法,仅适用于singleton模式
DI依赖注入:DI依赖注入是Ioc实现的重要技术,有两种方式
1、setter方式注入(推荐使用):给需要注入的类添加接口属性和其get/set方法,applicationContext里给需要注入的类引入接口实现类的bean的id。
2、构造方式注入:给需要注入的类添加接口属性以及构造实例方法,applicationContext里给需要注入的类引入<constructor-arg index="" ref="实现类">
AOP
什么是Aop及其好处?
Aop是面向切面编程。
好处:Aop切入点是共通处理。通过配置文件可以将共通的处理作用在一个或多个目标对象上,可以增加代码重用,使程序结构更好,更灵活。
Aop相关概念
1、Adpect切面:指的是共通业务处理,可以作用在一个或多个目标对象;
2、JoinPoint连接点:指的是切面组件在目标对象上作用的位置;
3、PointCut切入点:切入点事连接点的集合,采用表达式指定;
4、Target Object目标对象
5、Advice通知:切面组件在连接点上执行的动作;
6、AutoProxy动态代理:采用Aop之后,容器返回的时代里对象,用户调用的时候,有代理对象调用切面组件。
有接口的话使用JDK代理;
没有接口的话,采用CGLIB代理。
aop.xml配置:
<bean id="userService" class="com.maomao.service.UserServiceImpl"/>
<bean id="optLogger" class="com.maomao.OptLogger"/>
<aop:config>
<aop:pointcut id="servicePointcut" exprssion="execution(*com.maomao.service.*.*(..))"/>
<aop:aspect id="logAspect" ref="optLogger">
<aop:before method="logger" pointcut-ref="servicePointcut"/>
</aop:aspect>
</aop:config>
通知类型
<aop:before/>前置通知,在目标方法调用前执行,不影响后续执行,除非抛异常;
<aop:around/>环绕通知,在目标方法调用前和调用后都执行;
<aop:after-returning/>后置通知,在目标方法调用后执行,出异常不执行;
<aop:after/>最终通知,在目标方法调用后执行,不管是否有异常都执行;
<aop:after-throwing/>异常通知,出现异常才会调用。