备战秋招-Spring

Spring是一个轻量级的控制反转和面向切面编程的框架,其核心是IoC和AOP

IoC

Ioc(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,控制反转就是获得依赖对象的方法反转了。由主动的编程变成了被动的接收

  1. 为什么需要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代理实现的三个要点:

  1. 通过Java.lang.reflect.Proxy类来动态生成代理类;
  2. 代理类要实现InvocationHandler接口;
  3. 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();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值