一、Spring的注解方式实现
1、介绍
- 作用:
简化XML文件的配置,达到和XML配置完全相同的效果。 - 缺点:
耦合性太高。 - 使用和格式:
类上/方法上/属性上声明 - 注意:
注解和XML配置文件可以同时使用,但是同一个功能只能使用一种方式。
2、使用
注意:SpringAOP的注解方式实现是基于AspectJ方式的,SchemaBased方式是没有的。
- 在applicationcontext.xml文件中声明注解的扫描路径
- 在扫描路径下的某个功能上使用注解完成功能配置即可。
3、AOP注解
- @Component:相当于配置文件的bean标签,将某个类的对象扫描到Spring容器中。
此注解一般在普通Java类上用。 - @Service:相当于配置文件的bean标签,将某个类的对象扫描到Spring容器中。
此注解专门在业务层实体类上使用来表明该类为业务类。 - @pointcut:在切点方法上使用
- @Aspect:结合@Component在通知类上使用
- @Before/@After/@Around/@AfterThrowing:在前置/后置通知方法上声明
需要在其中声明对应的切点的全限定路径。
注意:需要在Spring的配置文件中声明AOP注解生效。
二、代理设计模式
1、设计模式:
- 概念:
设计模式其实就是代码的一种结构的设计思路。 - 好处:
增加代码健壮性、易修改性、可扩展性
-
种类:
建造类设计模式
结构类设计模式
行为类设计模式
2、代理设计模式
- 概念
将对某个功能的调用以及使用的代码封装起来,避免调用方式以及使用代码的直接暴露。 - 好处
①简化代码的使用流程
②保护真实的方法的调用方式
-
种类
①静态代理
②动态代理
3、静态代理
- 概念
真实对象:要进行功能扩展的对象
真实方法:要进行功能扩展的方法
代理对象:调用真实对象并完成功能扩展的对象。
代理方法:调用真实方法的扩展方法。
-
特点
代理对象和代理方法都是由程序员自己编写。 -
流程
在代理对象的代理方法中调用真实对象的真实方法,然后将代理对象和代理方 法对外暴露提供服务。
4、动态代理
- 特点
代理对象和代理方法是动态生成的。底层流程和静态代理一致。 - 种类
①jdk动态代理(官方提供):
原则:真实对象和代理对象实现相同的接口。
②cglib动态代理(第三方):
原则:代理对象继承真实对象。
-
JDK代理实现流程
①声明接口,并在接口中声明要进行代理的方法。
②创建真实对象实现接口,并完成方法的实现。
③创建扩展代理的对象,并声明对应的扩展代码。
④调用JDK官方的类文件获取动态生产的代理对象。
⑤使用代理对象完成功能处理。 -
cglib动态代理实现流程
①导入cglib的jar包。
②声明真实对象和真实方法。
③创建类并声明方法完成扩展代码的声明。
④使用Cglib提供的方法获取代理对象。
⑤使用代理对象完成功能处理。
5、SpringAOP底层代理设计模式
SpringAOP底层默认使用的JDK动态代理,但是同时也支持cglib动态代理。需要配置Cglib的依赖以及在Spring的配置文件中开启Cglib动态代理。
三、SpringTX
1、介绍
- 概念
编程式事务:事务管理代码由程序员自己编写。
声明式事务:事务管理代码由第三方直接提供,程序员直接将其组装到功能中即可。
-
使用流程
①导入jar包
②搭建Spring整合Mybatis的项目
③在applicationcontext.xml文件中配置事务管理bean(通知bean)
④在applicationcontext.xml文件中配置业务层bean
⑤在applicationcontext.xml文件中配置事务管理切面(组装规则)
⑥正常编写代码完成功能开发。
<!--配置事务管理-->
<!--配置事务管理bean(通知bean)-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property><!--配置事务管理的数据源-->
</bean>
<!--配置具体的事务管理方法:对AOP切点的通配范围的进一步缩减-->
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="ins*"/>
<tx:method name="del*"/>
<tx:method name="up*"/>
<tx:method name="sel*"/>
<tx:method name="transferAccountService*"/>
</tx:attributes>
</tx:advice>
<!--配置事务管理切面(组装规则)-->
<aop:config>
<aop:pointcut id="my" expression="execution(* com.*.service.impl.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="my"></aop:advisor>
</aop:config>
四、声明式事务中属性解释
- name=”” 哪些方法需要有事务控制
- readonly=”boolean” 是否是只读事务
- propagation 控制事务传播行为
- isolation=”” 事务隔离级别
- rollback-for=”异常类型全限定路径”
- no-rollback-for=”” 当出现什么异常时不滚回事务
五、Spring常用注解
注意:必须在Spring的配置文件中声明注解扫描。
- @Component:使用在普通java类上
- @Service:使用在业务层类上
- @Controller:使用在控制层类上,SpringMVC
作用:声明一个类的对象为bean对象,相当于配置了bean标签
使用:在SpringMVC的控制器类上使用。 - @Repository
作用:声明一个类的对象为bean对象,相当于配置了bean标签
使用:在数据库功能类上使用。比如Dao层对象 - @Resource
作用:替换在配置文件的依赖注入的。
使用:在有依赖关系的属性上使用,比如A中有B属性,则在B属性上声明,告诉Spring容器对象将B的bean对象注入到A的bean对象中。
注意:此注解是jdk官方的注解,不是Spring的注解,会先按照byName的方式注入,如果没有则按照byType的方式 继续注入,如果都没有则不注入。并且不需要提供get/set方法 - @Autowired
作用:和@Resource相同,都是替换依赖注入的配置的。
使用:在需要依赖注入的属性上声明
注意:该注解是Spring官方提供的,默认使用byType. - @Value
作用:用来替换配置文件中的属性注入的。
使用:在属性上声明,值为${“键名”}
示例: @Value(${“name”})
注意:使用此注解的注入,无需提供get/set方法。
六、Spring项目流程总结
- 确定项目需求:项目有哪些功能
- 确定项目的数据库:根据功能先把数据库设计好,然后再进行代码的编写
- 确定开发技术: Spring+MyBatis+Servlet+Jsp+Html+Jquery+Css
- 搭建项目开发基板:不考虑功能的编写,把能想到的基础配置先做了
- 创建web项目
- 在web-inf下创建lib文件夹并导入相关的jar
- 在src下创建并配置applicationcontext.xml文件
- 配置注解扫描路径
- 配置事务管理切面
- 配置事务管理的方法
- 配置事务管理的bean
- 配置mapper扫描bean
- 配置工厂bean
- 配置数据源bean
- 配置属性配置文件扫描路径
- 在webapp下的web-inf下的web.xml文件中配置Spring的配置信息
- Spring的配置文件路径
- Spring的监听器
- 完成功能开发
- 在Servlet中使用init方法完成Spring容器资源的初始化加载