一:反射机制
反射机制是spring的底层灵魂,与反编译有点类似,指定一个类名,直到运行时才加载这个类,运行时通过反编译来获取这个类的成员方法等。
作用是实现类、方法间的解耦,不需要频繁地 new 不同的对象,在编译阶段不报错,例子如两个合作开发但进度不同的程序猿。
一个需要调用另一个写的类,可以用 forname 函数先申明,通过编译后等另一个人的函数实现,即可直接运行。
在spring中,更是通过将指定的类名写入配置文件(properties文件)来实现控制翻转,即把new instance 的工作交给了 ioc 容器,而不是程序员在一个方法中new 另一个。
spring的工厂模式解耦,实际是将所有需要配置的类名,都写进了配置文件,每个类在调用配置文件中的类名的时候,使用 forName().newInstance 函数来创建这个类的实例,给发出请求的类使用。
https://www.cnblogs.com/yrstudy/p/6500982.html
Bean:可重用的组件
JavaBean: 用java编写的可重用组件
javaBean > 实体类
servlet:小程序,是单例对象,只有一个
单例对象和多例对象:单例是一个类产生的一个对象。多例是从同一个类产生的多个不同的对象。
多例对象被创建多次,多次初始化,效率不如单例
在spring中,因为 forName().newInstance 每次都会产生新对象,而很多情况,我们只需要单例,因此,用一个Map来存放创建的对象,称之为 容器
Ioc 控制翻转:
左边这种,一个类主动调用另一个类,使用 new 一个对象
右边,这个类在找对象时,并非直接要对象,而是问工厂要,这个工程就是 BeanFactory.getBean,这种方式,将找对象的控制权力,发放给了自定义的工厂,或算法定义的工厂,则称为控制反转。
控制反转类似于货币的产生,左边是一对一的资源交换,可能需要多次,而工厂或框架就类似于货币,实现一个中间者的角色。只能削减依赖,不能完全解除,如果完全解除,两个类变成了一个类,那就没有存在两个类的意义了。所以ioc的作用是解耦,降低程序间的依赖。
https://www.bilibili.com/video/BV1Sb411s7vP?p=15
Spring 中的 Ioc 配置:
步骤
1.在resources下面创建 xml 配置文件,添加bean标签,这个bean就是上文的工厂类,BeanFactory,只不过Spring化了
2. 获取到 Spring 的核心容器, 也就是上文的 Map,把 Bean 添加进去
Bean :
依赖注入:
在配置文件(bean.xml)中添加bean,这个bean的作用是给某个类传参并且实例化那个类。
1.一般不用的构造注入,因为类必须使用带参的构造函数,来让bean注入初始化参数。
被注入的类:
注入的数据:
2.set方法注入:更常用
Spring 中的 Ioc 注解:
注解的功能与xml配置bean有重叠,创建对象的注解的目的就是将类实现反射并加入容器中,注解较为简单
如果容器中,只有一个value 和当前类所需的类型符合,则autowired 可以直接掏出这个值,不看key:
仅使用autowire时,如果容器中,有两个 value 的类型都符合,则看key 的名称,如果有key名称一样的,则取出这个bean,如果没有则报错。
qualfiler 和 autowire 组合使用,指定bean id, resouce = 前两者的组合,直接指定id
注解的作用和xml配置文件是有大量重合的,如何用类的方法来代替xml配置文件,得使用到@Configration注解配置类
用配置类的方法去配置数据库连接,注意注解
通过propertySource指定另外的属性文件,将数据库的信息抽离,导入
Spring整合Junit 用于单元测试,Spring为了 测试,需导入 Spring-test 依赖
1.Spring单元测试的问题:
2.解决方案:
在测试时,让junit 注解使用Spring的测试类
AOP:
动态代理:用客户买电脑的例子,代理为经销商,被代理的是生产工厂。一个方法在调用另一个类的方法前,都会经过代理。
代理的作用,1. 把线程用完后放回线程池, 2.方法增强
在演示例子中是为了service 层 调用 dao 层时,在同一个事务中的一套转账过程具有原子性的同时,减少繁琐的代码,实现两层代码的分离,减少依赖。 即减少下部分事务同步代码的重复编写。
面向切面可认为是面向代理编程
代理商实现供应商(工厂)的接口,被称为基于接口的代理
调用cglib 创建代理类
Spring 中的 AOP:
实现方式还是动态代理,可以减少重复代码,方便维护,spring中的aop是通过注解方式实现动态代理。
与oop面向对象编程比,子类中的每一个方法通过代理,减少重复代码量,比如例子中,服务层每个函数在调用dao时,都要创建一个事务,但通过走代理,则只要直接调用dao层即可
连接点和切入点:
所有切入点是连接点,连接点是服务层一个类中所有方法,切入点只是被增强的方法。
几种通知:
通知就是dao层调用的方法,在数据库操作中就是crud
method.invoke():执行某方法
spring的aop配置:
例子是在一些方法前调用另一个类的logger方法
将通知和切入点方法关联起来,需要使用pointcut属性
对服务层所有类的所有方法都增强
实际开发中会指定类下所有方法进行增强
使用环绕通知时,如何保证切入点方法执行
环绕通知可以转变为其他三种通知,只需要根据你在原类中写入的位置
基于注解的aop:
用注解+自己编写类的方式,实现切面类,但四个通知执行顺序会有问题,环绕通知没这个问题,所以建议用注解方式
Spring中的JDBC Template:
在不用spring的方法时,在select时,要自己写一个类,将查询结果,以这种类的方式读取出来
用spring的beanPropertyRowMapper则不需要自己编写类,这个在实际开发中用的多
Spring的xml事务控制配置:
基于注解的spring事务控制器:
直接在业务层类或者方法上加Transactional注解,并先在bean.xml里添加注解bean以启用事务注解。
关注spring5.0新特性。响应式编程等