Spring框架
SpringIOC:控制反转【使用Spring容器创建对象】
《对象的创建》
1.写一个java类;
2.将该类放入Spring容器;
<bean id="helloWorld" class="cn.itheima03.spring.ioc.createobject.HelloWorld"></bean>
利用JAVA反射创建对象。
3.启动Spring容器;
4.取出对象;
《三种方法实例化bean》
1.默认构造函数
2.静态工厂方法实例化
3.实例工厂方法实例化
《Sprig创建对象默认的是单例对象》
1.Springle创建的对象默认的是单例的
2.把scope改为 prototype ,就是多例模式
3.Spring在默认情况下:启动Spring容器的时候创建bean对象
4.当把lazy-init设置为true以后,就是在调用对象的时候才会去创建对象
《Spring容器对对象的初始化,销毁的控制》
1.如果是单例对象,Spring容器对对象的创建,初始化和销毁都是Spring容器控制的;其中创建对象完成以后,执行init方法。当Spring容器关闭的时候,执行destroy方法。
2.如果不是单例对象,是多例对象的话,Spring容器不负责对象的销毁,只会负责对象的创建和初始化。
3.如果spring中的bean是多例的,不管在配置文件中lazy-init设置成什么样的值,在context.getBean时才要创建对象【调用的时候才会创建对象】,而且不负责销毁。
SpringDI:依赖注入【使用Spring容器为对象的属性赋值】
1,使用set方法为属性赋值:
在配置文件中使用<property></property>为对应的属性赋值,在Spring容器启动的时候,先创建对象然后封装对象,为对象的属性赋值
2.使用构造器为属性赋值:
在配置文件中
<bean id="person_con" class="cn.itheima03.spring.di.constructor.Person">
<constructor-arg index="0" value="王二麻子"></constructor-arg>
<constructor-arg index="1" ref="student_con"></constructor-arg>
</bean>
当Spring容器启动的时候,创建对象用上面的constructor确定构造函数,然后利用该构造器就可以了【封装属性的值】,不用默认的构造函数了。
Spring的注解
在Person.java的student属性上 @Resource(name="student")来注解
1、在spring的配置文件中,加入命名空间
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
2、在spring的配置文件中,开启注解解析器
<context:annotation-config></context:annotation-config>
3、把person和student放入到spring容器中
<bean id="person" class="cn.itheima03.spring.di.annotation.Person"></bean>
<bean id="student" class="cn.itheima03.spring.di.annotation.Student"></bean>
4、在Person类中的student不需要set和get方法
原理:
1、当启动spring容器的时候,给spring容器的bean创建对象
2、当spring容器解析到<context:annotation-config></context:annotation-config>的时候,
spring容器扫描在spring容器中的bean
3、查看bean中的属性或者方法上有没有@Resource
1、有
1、如果该注解的属性name的值为"",则会按照属性的名称和spring中的ID值进行匹配,如果匹配
成功,则赋值,如果匹配不成功,则按照类型进行匹配,如果类型匹配不成功,则报错
2、如果该注解的属性name的值不为"",则按照name属性的值和spring中的ID值进行匹配,
如果匹配成功,则赋值,匹配不成功,则报错
2、没有
说明:
基本类型不能用注解赋值
注解的效率没有xml文件的高,但是书写比较简单
Autowired按照类型进行匹配
@Autowired
@Qualifier("studen")按照ID进行匹配
按照类型匹配比较危险
《SpringAop面向切面编程》【切面:事务;通知:开启事物,关闭事务等就叫通知。SpringAop实现控制事务的原理是使用 代理对象;】
1.使用SpringAop来实现事务的控制
《SpringAop的配置》
1.在Spirng的配置文件中配置SpringAop的三要素:1.目标类。2. 切面。3.进行AOP的配置
2.重点掌握AOP的配置
实例:
<aop:config>
<!--
aop:pointcut:切入点表达式
expression切入点表达式--对应目标类
id 唯一标示
expression切入点表达式--规定对应的目标类
execution(* cn.itheima03.spring.aop.xml.ClassesDaoImpl.*(..)):代表cn.itheima03.spring.aop.xml.ClassesDaoImpl类中的所有方法
-->
<aop:pointcut expression="execution(* cn.itheima03.spring.aop.xml.ClassesDaoImpl.*(..))" id="perform"/>
<!--
aspect:切面
ref引向切面的bean
-->
<aop:aspect ref="myTransaction">
<aop:before method="beginTransaction" pointcut-ref="perform"/>
<!--
后置通知
returning 返回值
-->
<!--
<aop:after-returning method="commit" pointcut-ref="perform" returning="val"/>
-->
<!--
最终通知
无论目标方法是否有异常,都执行
-->
<!--
<aop:after method="finnalyMethod" pointcut-ref="perform"/>
-->
<!--
异常通知
throwing 获取目标方法抛出的异常信息
-->
<aop:after-throwing method="throwingMethod" pointcut-ref="perform" throwing="ex"/>
<!--
<aop:around method="aroundMethod" pointcut-ref="perform"/>
-->
</aop:aspect>
</aop:config>
《SpringAOP的实现原理》
1.Spring容器开始的时候创建目标类对象和切面类对象,阅读到<aop:config>AOP配置的时候,通过切入点表达式去寻找Spring容器中创建的bean对象。如果找到该对象,就把目标类和通知结合起来创建出代理对象。如果没有找到该对象,就会报错。通过代理对象来实现对数据库的操作。例如对于数据库操作来说:我们只用关心数据库的增删该查操作就可以了,不用去关心事务了,由Spring容器去控制事务.
2.如果目标类实现了接口,生成的代理对象是jdkproxy,同时context.getBean()得到的是对象使用接口完成转化;如果没有实现接口,生成的代理对象是cglibproxy代理类,得到的是实例对象。
《SpringAOP的各种通知》
1.前置通知:在目标方法之前执行;无论目标方法遇到异常都执行
2.后置通知:在目标方法之后执行;如果目标方法遇到异常,则不执行;可以获取到连接点的一些信息
3.最终通知:相当于finally,无论目标方法是否遇到异常都执行
4.异常通知:获取目标方法抛出的异常信息;throwing参数的配置才能获取信息
5.环绕通知:相当于jdkproxy的invoke方法,控制目标方法的执行
《SpringAop的配置》
1.在配置文件中明确目标类和切面类。
2.明确切入点和通知
其中【切入点】指的是切面的具体实现应用在目标类的那些方法和属性上面,在执行目标类的那些方法的时候触发切面的应用
【通知】就是在目标类的方法执行的摸个阶段开始出发这些通知