1)单例对象,如果多线程访问的情况下,有线程安全的问题;
2)解决IOC依然有XML的问题;
3)config.SpringConfiguration,该类是一个配置类,其作用相当于bean.xml
4)@Bean: 用于把当前方法的返回值作为bean对象存入spring的IOC容器中:
属性:
name: bean的id, 当不写时,默认值是当前方法名称
5)@Import(xxx.class): 用于导入其它的配置类;
class<?>... xxx: 可变参数
6)@PropertySource
7)Spring整合JUnit的配置:
不能更改别人的class字节码
8)@Runwith: 整合JUnit的, 替换Main函数的
9)事务的引入:
(1)中间出现了异常,发现加和减对不上
分析: 4次操作,有4个connection,每一个connection都会有一个事务.
解决方案: 只用一个connecttion--》ThreadLocal对象的引入:
使用ThreadLocalUI想baConnection和当前线程绑定,从而一个线程中只有一个能控制事务的对象
(2)之前没有问题的原因: 每次操作都会创建一个对象,每次数据库操作,都会从连接池中拿出一个连接
AOP优势的引入:
10)ThreadLocal:
连接的工具类,它用于从数据源中获取一个连接,并且实现和线程的绑定;
获取当前线程上的连接;
11)连接池
(1)web app在tomcat启动时,创建出来连接, 在外部使用时,保证执行效率;
12)已经close的连接时归还到连接池了,要和Threadlocal解绑
13)让Service有事务的控制
14)保证方法间的独立,不让有方法间的这种耦合关系;
15)动态代理解决的问题:
(1)生产厂家
(2)--》经销商/代理商(销售、售后)
(3)6999的电脑买到后, 经销商还是6999吗? 很可能是低很多,可能是4999, 另外2000可能是库房、培训等..
(4)我们不能和生产厂家联系了, 生产厂家只是生产电脑
代理实现了功能增强
16)认识接口
(1)java中接口就是标准,你必须实现
17)动态代理:
特点: 字节码随用随创建,随用随加载;
作用:在不修改源码的基础上对方法增强;
分类: 基于接口的动态代理
涉及的类: Proxy
提供者: 官方
如何创建代理对象:
使用Proxy类中的newProxyInstance方法:
参数:
ClassLoader: 类加载器(固定写法)
用于加载代理对象字节码的,写的是: 和被代理对象使用相同的类加载器;
Class[]: 字节码数组(固定写法)
它是用于让代理对象和被代理对象有相同的方法。
InvocationHandler: 用于提供增强的代码
它是让我们写如何代理,我们一般都是写一个该接口的实现类,通常情况下都是匿名内部类(非必须)
作用: 执行被代理兑现改的任何接口都会经过该方法.
proxy: 代理对象的引用
method: 当前执行的方法
args: 当前执行方法所需的参数
return: 和被代理对象有相同的返回值
// 提供增强的代码
1.获取参数 args[0]
2.判断当前方法是不是销售 method.getName()
return method.invoke(producer, args)
要求: 被代理类至少实现一个接口,没有则不能使用. 因此问题也是: 不识闲任何接口,则不可以用.
基于子类的动态代理(cglib)
涉及的类: Enchancer
提供者: 第三方cglib
如何创建对象:
使用Enhancer的create方法:
Class
Callback
MethodInterceptor:
intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
Enchaner.create(producer.getClass())
18)使用:
加回到池子里
乱码方法的增强
19)1个实现类,一个实现动态代理的
@Autowired
@Qualifier("proxyAccountService")
private IAccountService as;
11)配置中变得繁琐了,那么如何简化配置呢? AOP来啦!!!