Spring是一个轻量级的控制反转和面向切面编程的框架,其核心是IoC和AOP
IoC
Ioc(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,控制反转就是获得依赖对象的方法反转了。由主动的编程变成了被动的接收
- 为什么需要IoC?
set接口实现
:当dao有多个实现类时,业务层每次创建对象的代码也需要改变。// Service层接口实现类 public class UserServiceImpl implements UserService{ private UserDao userDao = new UserDaoImpl public void getUser(){ userDao.getUser(); } } //Test类
如果此时用户需要发生改变,增加了其它的DaoImpl,如果增加Dao的实现类的话,那么service实现类⾥也要修改对应的实现。所以这时出现了set接口实现的方法
构造函数
:把底层类作为参数传入上层类,实现上层类对下层类的“控制”
- 因为采用了依赖注入,在初始化的过程中就不可避免的会写大量的new。这里IoC容器就解决了这个问题。这个容器可以自动对你的代码进行初始化,你只需要维护一个Configuration(可以是xml,也可以是一段代码),而不用每次初始化一辆车都要亲手去写那一大段初始化的代码。这是引入IoC Container的第一个好处。
- 第二个好处:
- 之前,程序是主动创建对象,控制权在程序猿手上,所以用户的每个需要都需要我们修改实现类代码。使用set注入后,程序变成了被动接收对象
AOP
Aspect-Oriented Programming,即面向切面编程,通过代理对象在运行时织入
代理对象
- 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
- 动态代理:在程序运行时,运用反射机制动态创建而成。
- 动态代理分为两类:基于接口的代理和基于继承的代理。两类实现的代表是:JDK代理和CGlib代理。
JDK代理模式
JDK动态代理主要涉及java,lang.reflect包下的两个类:Proxy类和InvocationHandler接口
JDK代理实现的三个要点:
- 通过Java.lang.reflect.Proxy类来动态生成代理类;
- 代理类要实现InvocationHandler接口;
- JDK代理只能基于接口进行动态代理的;()
// 接口,jdk动态代理必须的前提
interface Marry{
void HappyMarry();
void hello();
}
// 真实对象
class You implements Marry{
@override
public void HappyMarry(){
System.out.println("香飘飘和优乐美要结婚了~")
}
}
//代理对象:婚庆公司,实现 InvocationHandler接口
class WeddingCompany implements InvocationHandler{
//代理谁?--》目标对象(真实角色)
private You you;
//构造方法,初始化目标对象
public WeddingCompany(Marry target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object result = null;
try{
//利用反射动态的来反射方法,这就是动态代理和静态代理的区别
result = method.invoke(realSubject,args);
}catch (Exception e){
System.out.println("ex:"+e.getMessage());
throw e;
}finally {
System.out.println("after");
}
return result;
}
}
public class StaticProxy{
public static void main(String[] args){
//多线程
/**
new Thread(new Runnable(){
@override
public void run(){}
}).start();
**/
//因为Thread实现了Runnable接口,所以是个代理方法,代理了Runnabele接口
new Thread(()-> System.out.println("门当户对,奶茶大卖")).start()
//婚庆公司代理真实对象结婚
new WeddingCompany(new You()).HappyMarry();
}
}