spring为程序猿们带来了春天~
1.spring是可以非常方便的拿过来就用,而且加入了 spring可以放心不会对原本的代码冲突。
把所有的对象都交给spring去统一管理,再也不用去new 对象了,减少了很多代码量。
可以通过配置文件的方式,注册bean。然后在通过spring上下文获取bean对象。通过配置文件的方式把所有的对象都交给spring这样可读性也会变高,不过这种通过配置文件的方式注册bean用的少,通常是通过注解的方式。
2.spring的特点
spring有两大特点控制反转IOC和切面编程AOP。
那什么是IOC呢?
以前是把一个接口对象写死,控制权在程序当中。
例如:有个接口是 DataSource 当中有个抽象方法是
public void targetDataBase();有这么几个实现类 OracleDataSource,SQLServerDataSource,MySQLDataSource。它们都实现了其抽象方法。然后在service层调用DataSource接口时,
DataSource dataSource=new OracleDataSource();是这样写的。然后就会发现一个问题,就是很不方便,当中的接口实现对象是写死的。如果更换实现类,就需要再在程序中改这样太麻烦了。所以就不能把接口实现对象写死,那么可以把控制权交给用户,让用户去调用。service层调用的时候可以这样把接口作为属性 private DataSource dataSource;然后通过set方法为该属性注入值 public void setDataSource(DataSource dataSource){ this.dataSource=dataSource };。然后再在控制层调用service层为其注入接口的实现类。这样控制权就不在程序中了。
IOC的反转控制,把控制权交给了spring和上面的例子是一样的道理
AOP是什么呢?
在软件研发过程中需要在原来的业务当中添加功能,如果直接去改变原来的代码,这样是有很大的弊端的,先不说你改完了之后,原来的功能还能不能正常使用,原来的代码逻辑之间互相调用互相衔接这样改起来是很费劲的耦合度太高了。AOP的思想就是通过代理机制。把之前的业务代理过来,然后再在代理中添加新的业务。
比方说一个订单的模块
分为几个角色:
抽象角色:订单接口
真实角色:实现订单接口的类
代理角色:代理类
代理类也会实现订单接口,然后调用真实角色实现接口方法中的订单功能,这样订单模块就被代理过来了,接着在代理类中写新的功能。这种利用的是静态代理,一个真实角色就要写一个代理类。
动态代理分为jdk动态代理和cglib动态代理
我们用aop注解时@Aspect 可能会配置
<aop: aspectj-autoproxy proxy-target-class="true"/> proxy-target-class 这个属性不写或值为true它会默认jdk动态代理机制 ;proxy-target-class="false"会默认cglib动态代理机制。
jdk动态代理 需要用到反射包下 的InvocationHandler接口和Proxy类
Proxy生成代理类。InvocationHandler处理代理实例
动态代理类:
调用动态代理类测试:
通过创建ProxyInvocationHandler类的对象
调用setTarget(Object target) 方法 参数是需要被代理的接口 然后调用getProxy()方法生成代理类