发表于: 2018-03-28 09:31:01
1 730
今天完成的事情:
学习了AOP。注解方式实现AOP。对IOC,DI,AOP思想加深理解。注解方式进行测试。
1.面向切面编程。
概念理解:开发的时候可以把核心业务和周边功能分开开发。核心业务开发好之后在核心代码完全不变的情况下,通过“编织”的方法,把周边功能编织到核心业务上。
当然,核心业务是什么,要根据项目来决定。
使用spring框架完成上面的步骤:
(1)开发核心业务。
(2)开发周边功能。
(1)(2)是可以同时进行的。可以分给不同人来做。
(3)用spring框架编织。写xml配置文件,定义Bean,得到业务实例,通过业务实例调用业务方法。编写aop:config,在config中编织周边功能。
(4)测试看结果。
完成了网站上的一道习题,统计性能。
思索了下,决定把之前做的连接池操作数据库耗时与传统方法操作数据库耗时用AOP做一遍。
只为熟悉spring操作,数据库是用之前的设计。
(1)核心业务:连接池插入数据业务;传统方法插入数据业务。(TestConnectionPool 类)
(2)周边功能:耗时统计。(Sta类)
(3)编织并测试。
xml配置文件:
service包下的Sta其实是aspect,是统计消耗时间的周边功能。
date包下的TestConnectionPool是核心业务类。
Sta类如下:
package service;
import org.aspectj.lang.ProceedingJoinPoint;
public class Sta {
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
long start=System.currentTimeMillis();
Object object = joinPoint.proceed();
long end=System.currentTimeMillis();
long cost=end-start;
System.out.println(joinPoint.getSignature().getName()+"方法耗时为:"+cost+"毫秒.");
return object;
}
}
测试类如下:
测试结果:
三月 28, 2018 12:40:21 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5c29bfd: startup date [Wed Mar 28 12:40:21 CST 2018]; root of context hierarchy
三月 28, 2018 12:40:21 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [xiuzhen.xml]
三月 28, 2018 12:40:21 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@174d20a: defining beans [tcp,tj,org.springframework.aop.config.internalAutoProxyCreator,cut,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0]; root of factory hierarchy
连接池大小为10
开始建立连接0
连接0建立完毕
开始建立连接1
连接1建立完毕
开始建立连接2
连接2建立完毕
开始建立连接3
连接3建立完毕
开始建立连接4
连接4建立完毕
开始建立连接5
连接5建立完毕
开始建立连接6
连接6建立完毕
开始建立连接7
连接7建立完毕
开始建立连接8
连接8建立完毕
开始建立连接9
连接9建立完毕
连接池方式开始
连接池方式结束
test1方法耗时为:112955毫秒.
传统方式开始
传统方式结束
test2方法耗时为:12035毫秒.
连接池时间还长,原因是把连接池建立连接的的时间也给算上了。这里主要是为了测试spring,可以看到AOP成功了。
测试函数中用构造器得到实例,也可以实现AOP。只要定义出了ApplicationContext类,就可以完成AOP。
完整项目放在GitHub上了。
2.注解方式实现AOP
在AOP这里用到的注解主要有:
@Aspect 说明这是一个切面
@Component 说明是一个Bean
@Around(value="execution(* 服务类.*(..)") 说明用下面这个方法编织服务类和切面。
xml文件配置:
用注解的方式,如果一个切面要和两个服务编织,用如下的方式:
这个估计不是最好的方式,是我试出来的可以实现的方式。直接写两行@Around注释会报错。
感觉注释方式用起来比较方便。
3.对IOC,DI,AOP加深理解。
查阅了一些资料,看了一些介绍和例子。下面一段话感觉对现阶段的我很有帮助。
如果用new创建实例,需要编译的时候确定下来,而用IoC,DI,就不需要在编译的时候确定下来了,而是运行时。而AOP实现了业务类和外部功能的解耦。我会继续在使用中体会这些。
还看到一些软件工程的思想,什么高内聚,低耦合什么的,继续慢慢理解。
4.注释的方式来测试
用到的注释为:
@RunWith(SpringJUnit4ClassRunner.class) 表示是spring测试类
@ContextConfiguration("classpath:path") 指定xml文件路径。path写配置文件路径
@Autowired 自动给出测试类的实例
@Test 指出这是测试方法
具体代码写成下面这样:
打印出的结果如下(编织了两个切面):
明天计划的事情:学习spring MVC
遇到的问题:用注解方式做AOP的时候,如何简单的把一个切面和两个服务编织在一起?我现在用的是要把那个编织的方法重写一遍,感觉应该不太对。
收获:学会了用注释的方式实现AOP,测试。更多的了解了spring的思想,了解了一点软件工程的思想。
评论