发表于: 2017-12-10 15:48:32
2 741
昨天对spring的简单的学习还有spring的简单的注入方式(IOC/DI 和 对象的注入)
今天计划完成IOC/DI的注入方式还有Aop面向切片编程
一.今天是IOC和DI的注入方式
1.以前的通过bean的注入取消修改applicationContext.xml里面以前的去掉,加上<context:component-scan base-package="com.fuwei.spring "/>
意思是让spring,bean都在com.fuwei.spring
替换成context
2.在category类里面为Category 类加上@Component注解,即表明此类是bean
因为配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了,以前写在bean里面的values
在product里面也是一样的
因为配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了,以前写在bean里面的values
还有多了一个@Autowired注解
@Autowired
Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
在product的里面是一样的完成就是多了一个@Autowired注解,主要是函数方法的自动装配
3.测试的类testspring(里面的测试类还是没有变)
测试的结构也是一样的
product里面的初始化的值
category里面的初始化的值
这个IOC和DI的注入完成
简单对比一下:在注入的方式的情况下
1.先是在applicationContext.xml里面的那些复杂的bean的配置,简化了;
2.就是在product和category里面的类上面配置@Resource(name="c")让spring知道bean的配置在实体的类里面;
3.@Autowired在具体的类的属性前面配置
二.开始接触Aop面向切面的编程
AOP 即 Aspect Oriented Program 面向切面编程
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等
周边功能在Spring的面向切面编程AOP思想里,即被定义为切面
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发 ,然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP
主要是将主要功能和辅助功能分开----->
1.先是创建一个ProductService和 LoggerAspect的连个完成业务方法运行之前和之后分别会打印日志 的两个类
第一个ProductService业务类
第二个 日子打印的类LoggerAspect
2.就是在applicationContext.xml(我觉得这里面的比较重要,就是怎么实现Aop的那个切面的编程的,怎么添加在Aop 里面)
bean里面的----->声明业务对象
<bean name="s" class="com.fuwei.service.ProductService">
</bean>
声明日志切面
<aop:config>
<aop:pointcut id="loggerCutpoint"
expression=
"execution(* com.fuwei.service.ProductService.*(..)) "/>
<aop:aspect id="logAspect" ref="loggerAspect">
<aop:around pointcut-ref="loggerCutpoint" method="log"/>
</aop:aspect>
</aop:config>
指定右边核心业务功能
<aop:aspect id="logAspect" ref="loggerAspect">
<aop:around pointcut-ref="loggerCutpoint" method="log"/>
</aop:aspect>
指定左边的辅助功能
然后通过aop:config把业务对象与辅助功能编织在一起。
<aop:pointcut id="loggerCutpoint"
expression=
"execution(* com.fuwei.service.ProductService.*(..)) "/>
这表示对满足如下条件的方法调用,进行切面操作:
* 返回任意类型
com.fuwei.service.ProductService.* 包名以 com.fuwei.service.ProductService 开头的类的任意方法(..) 参数是任意数量和类型
3.接下就是测试的代码
开始先还是context里面获取bean通过productService连接------>最后调用doService();
这里对应的Aop 的调用的打印
运行的步骤: testSpring -----> loggerAspect -------> doService(三个顺序)
今天完成的事情:
完成了IOC/DI的注入的实现简单对比一下:在注入的方式的情况下,还有开始了解了AOP的面向切面的编程---->怎么注入的过程,还有调用的过程
IOC/DI注入的比较总结
1.先是在applicationContext.xml里面的那些复杂的bean的配置,简化了;
2.就是在product和category里面的类上面配置@Resource(name="c")让spring知道bean的配置在实体的类里面;
3.@Autowired在具体的类的属性前面配置
明天的计划:
完成Aop的注入方法的实现,注解的测试,(先实现Aop的注入方式,在熟悉spring的测试)
今天遇到的困难:
applicationContext.xml里面的AOP的注入的方法,那个Aop的
Spring横切面(advice),增强(advisor),切入点(PointCut)的一点理解:
Spring增强(advisor)=切面(advice)+切入点(PointCut)
下面是我查的一些资料,但是有点不明白,AOP哪里是怎么实现---->怎么样切片的
其中的“aop:pointcut”标签中"expression"的写法规则如下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
ret-type-pattern,name-pattern(param-pattern)是必须的.
ret-type-pattern:标识方法的返回值,需要使用全路径的类名如java.lang.String,也可以为*表示任何返回值;
name-pattern:指定方法名,*代表所有,例如set*,代表以set开头的所有方法.
param-pattern:指定方法参数(声明的类型),(..)代表所有参数,(*)代表一个参数,(*,String)代表第一个参数为任何值,第二个为String类型.
表达式例子如下:
任意公共方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
定义在service包和所有子包里的任意类的任意方法的执行:
execution(* com.xyz.service..*.*(..))
定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")
今天的收获:
主要是对IOC/DI的注入方式,简单的学习了,AOP面向切面的方式,但是还有一些问题,后面在多看一下,怎么aop什么实现的切片编程
荆轲刺秦王----->加油 坚持
评论