Spring笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring笔记相关的知识,希望对你有一定的参考价值。
Spring核心知识点:
一、Spring简介
1.Spring是一个轻量级框架,不依赖于任何容器
2。Spring是一个容器,包含很多技术在内的大杂烩
3。Spring核心思想IOC和AOP.
4.Spring可以非常容易地与其他框架整合
二、搭建Spring的步骤
1.引入jar包(导入给的必须的jar包下的所有文件)
2.添加spring的配置文件
3.在main方法中获取spring的xml文件方法:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
三、Spring的IOC思想
1.使用Spring的xml文件管理bean的生命周期和依赖关系
具体配置说明:
1)(常见)创建对象的方式之一:使用构造方法创建
bean:基本对象
id:唯一进行区分的标识
class:权限命名(完整的包名+类名)
name:为bean起的别名
如果不使用构造方法,则默认调用空的构造方法
2)创建对象的方式之二:使用工厂创建
1.静态工厂:class="生产对象的工厂的class名称"
factory-method:生产对象使用的方法的名称
2.非静态工厂:不配置class
factory-bean:生产对象的工厂(spring管理的其他bean的引用)
factory-method:
3)配置属性的方式之一:使用property标签注入
a)普通属性
<property name="name" value="小明"></property>
<!-- ref:参照的对象名
管理的bean的id
-->
b)单个引用类型数据
<property name="book" ref="mybook"></property>
c)属性是数组类型的
<property name="favs">
<array>
<value>编程</value>
<value>跳舞</value>
<value>唱歌</value>
<value>书法</value>
</array>
</property>
d) 注入list集合
<property name="names">
<list>
<value>小王</value>
<value>王二小</value>
<value>小二</value>
</list>
</property>
e) map集合注入
<property name="map">
<map>
<entry key="1" value="第一个"></entry>
<entry key="2" value="第二个"></entry>
<entry key="3" value="第三个"></entry>
</map>
</property>
f)Properties属性注入
<property name="propertis">
<props>
<prop key="a">abstract</prop>
<prop key="b">buy</prop>
<prop key="c">cute</prop>
</props>
</property>
4)配置属性的方式之二:使用constractor-args标签注入
index:参数的索引位置,从0开始
name:参数的名称
type:参数的数据类型
value:注入的值
<constructor-arg value="110" />
<constructor-arg value="lili"/>
5)对IOC的理解:
传统模式:对象的创建和依赖关系的维护都散落在业务逻辑中,不方便管理
Spring:对象的创建和依赖关系的维护都交由Spring管理,方便维护,更有利于解耦。
这种形式的转变,可以称为是控制的反转,即IOC(Inversion of Control),也可以成为Dependency Inversion(依赖的反转)
6)bean 的生命周期的管理
scope:控制bean的生命周期
取值:singleton:默认:单例的对象
prototype:多例
request/session/application...在web开发中使用
四、Spring的AOP思想
1.静态代理模式
要求:
代理对象:代理target执行功能的对象
被代理对象:target
两者同时实现同一个接口
2.动态代理模式:可以动态生成代理对象,并实现代理任何类的任何方法
3.JDK自带的动态代理:要求被代理的对象必须实现接口
使用步骤:
1)编写类Implements InvocationHandler接口
2)重写invoke()方法:
invoke():是底层自动调用,功能:代理调用target的method方法,在前后可以织入其他逻辑
*
* Object proxy:代理对象。需要写方法产生
*
* Method method:target的想要被调用的方法对象
*
* Object[] args:该方法中的参数
3)在该类中封装被代理对象
private Object target;//在代理类中封装一个被代理的对象
4)编写方法产生动态代理对象
public Object createProxy(Object target)
{
this.target = target;
//产生代理对象]
/**
* 第一个参数:ClassLoader:被代理对象的类的加载器
* 第二个参数:被代理对象实现的所有接口
* 第三个参数:handle
*/
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
5)调用方式:
JDKDynamicProxyHandler handler = (JDKDynamicProxyHandler)ctx.getBean("jdkdp");
IUser proxy = (IUser)handler.createProxy(user);
proxy.study();
4.Spring中的Advice
根据执行的时机不同分为
前置消息:implements MethodBeforeAdvice
后置消息: implements AfterReturningAdvice接口
环绕消息: implements MethodInteceptor 接口
使用步骤:1.创建类并实现合适的接口
2.在xml中配置
<aop:config>
配置切入点 :在哪些类的哪些方法上织入advice
expression="execution()" *通配符
..在参数部分通配
第一个*,匹配返回值位置
<aop:pointcut expression="execution(* com.web.service.*.*(..))" id="logCut"/>
织入消息:
配置的先后基本可以决定执行的先后
<aop:advisor advice-ref="before" pointcut-ref="logCut"/>
<aop:advisor advice-ref="after" pointcut-ref="logCut"/>
<aop:advisor advice-ref="around" pointcut-ref="logCut"/>
</aop:config>
5.自定义Advice的实现
6.AOP核心思想
五、注解方式
1.注解和xml的区别:
各自特点:注解—开发效率高,简洁,与源码耦合
Xml ----传统,复杂,功能更强大些,与源码不耦合
2.Spring提供的注解
需要在xml中加入:<context:component-scan base-package="com.web"/>
1)@Component 统一的标识,标识该类是由spring来管理的一个组件
2)@Controller 管理Model层的组件
3) @Service 管理service层的
4)@Repository 管理持久层的组件
5)维护依赖关系
@Resource
默认情况,使用名称注入参数(byName),如果不指定名称,则会根据反射自动找数据类型(byType)
需要在@Resource 和其他组件的注解上配合使用
@AutoWired 自动装配
优先使用byType注入
如果想使用byName方式注入,则需要配合@Qulifier注解
@Qulifier使用在属性上,set方法入参中,构造方法入参中
AOP中的注解:
@Aspect:AOP中使用的注解,标记该类是一个切面
@Pointcut("execution(* com.web.service.*.*(..))"):设置切入点
一般情况下,如果多个方法共用一个切入点,则可以先定义一个方法,在方法上使用该注解,则后续的方法的注解中使用该方法名称作为切入点的引用。
@Before("pointcut()"):在核心业务逻辑之前执行
要求注解中必须添加切入点
@After("pointcut()"):在核心业务逻辑之后执行
@Around("pointcut()"):环绕型Advice
@AfterReturning("pointcut()"):程序正常退出时调用的advice
注解中可使用的参数:pointcut—指定切入点
returning—接收返回值
以上是关于Spring笔记的主要内容,如果未能解决你的问题,请参考以下文章