发表于: 2017-12-10 15:48:32

2 741


昨天对spring的简单的学习还有spring的简单的注入方式(IOC/DI 和 对象的注入)

今天计划完成IOC/DI的注入方式还有Aop面向切片编程

.今天是IOCDI的注入方式

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里面的初始化的值

这个IOCDI的注入完成

简单对比一下:在注入的方式的情况下

1.先是在applicationContext.xml里面的那些复杂的bean的配置,简化了;

2.就是在productcategory里面的类上面配置@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.就是在productcategory里面的类上面配置@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什么实现的切片编程

 

荆轲刺秦王----->加油 坚持

 



返回列表 返回列表
评论

    分享到