Spring Aop和Spring Ioc(一)
Spring Aop
Aop:
面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。
1:主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。
2:主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,
我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
AOP的一些实现:
用AOP给service加一些其他的功能
Dao层:
package cn.spring.mapper;
import cn.spring.entity.User;
public interface IUserMapper {
public Integer addUser(User userinfo);
}
Dao层实现类
package cn.spring.mapper.impl; import cn.spring.entity.User;
import cn.spring.mapper.IUserMapper; public class IUserMapperImpl implements IUserMapper {
@Override
public Integer addUser(User userinfo) {
System.out.println("addUser");
return 0;
}
}
Service层
package cn.spring.service;
import cn.spring.entity.User;
public interface IUserService {
public Integer addUser(User userinfo);
}
Service层实现类:
package cn.spring.service.Impl; import cn.spring.entity.User;
import cn.spring.mapper.IUserMapper;
import cn.spring.service.IUserService; public class IUserServiceImpl implements IUserService { private IUserMapper iUserMapper; public IUserMapper getiUserMapper() {
return iUserMapper;
} public void setiUserMapper(IUserMapper iUserMapper) {
this.iUserMapper = iUserMapper;
} @Override
public Integer addUser(User userinfo) {
Integer integer = iUserMapper.addUser(userinfo);
return integer;
}
}
第一种方法:实现MethodBeforeAdvice(前置增强)接口,AfterReturningAdvice(后置增强)接口
增强类:
package cn.spring.advice; import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class AdivceMethod implements MethodBeforeAdvice, AfterReturningAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("====================日志=================");
} @Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println("====================事务=================");
}
}
applicationcontextbean.xml
将Dao层与service层进行关联
<bean id="iUserMapper" class="cn.spring.mapper.impl.IUserMapperImpl"></bean>
<bean id="iUserService" class="cn.spring.service.Impl.IUserServiceImpl">
<property name="iUserMapper" ref="iUserMapper"></property>
</bean> 找到要增强类
<bean id="Adivec" class="cn.spring.advice.AdivceMethod"></bean>
配置aop
<aop:config >
<aop:pointcut id="pointcut" expression="execution(* *..service.*.*(..))"/> 找到在那增强,并指定增强哪里的内容
<aop:advisor advice-ref="Adivec" pointcut-ref="pointcut"></aop:advisor> 调用增强
</aop:config>
测试类:
package cn.spring.test; import cn.spring.entity.User;
import cn.spring.print.print;
import cn.spring.service.IUserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class aoptest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontextbean.xml");
IUserService bean = (IUserService)context.getBean("iUserService");
bean.addUser(new User());
}
}
结果:

第二种方法:不实现MethodBeforeAdvice(前置增强)接口,AfterReturningAdvice(后置增强)接口
增强类:
package cn.spring.advice;
public class Adivce{
public void before(){
System.out.println("基于配置的前置");
}
public void after(){
System.out.println("基于配置的后置");
}
}
applicationcontextbean.xml
将Dao层与service层进行关联
<bean id="iUserMapper" class="cn.spring.mapper.impl.IUserMapperImpl"></bean>
<bean id="iUserService" class="cn.spring.service.Impl.IUserServiceImpl">
<property name="iUserMapper" ref="iUserMapper"></property>
</bean>
<bean id="befor" class="cn.spring.advice.Adivce"></bean>
<aop:config >
<aop:pointcut id="pointcut" expression="execution(* *..service.*.*(..))"/>
<aop:aspect ref="befor">
<aop:before method="before" pointcut-ref="pointcut"></aop:before>
<aop:after method="after" pointcut-ref="pointcut"></aop:after>
</aop:aspect>
</aop:config>
结果:

Spring Ioc的三种注入方式:
实体类:
package cn.spring.entity;
public class User {
private Integer id;
private String username;
public Integer getId() {return id; }
public void setId(Integer id) { this.id = id;}
public String getUsername() {return username;}
public void setUsername(String username) { this.username = username;}
public User(Integer id, String username) {
this.id = id;
this.username = username;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
基于Setter注入:
applicationcontextbean.xml
<bean id="user" class="cn.spring.entity.User">
<property name="id" value="1"></property>
<property name="username" value="李一"></property>
</bean>-->
基于构造注入:
<bean id="user" class="cn.spring.entity.User">
<constructor-arg value="2" type="java.lang.Integer" index="0"></constructor-arg>
<constructor-arg value="王二" type="java.lang.String" index="1"></constructor-arg>
</bean>
该方法必须有对应的构造方法
p命名空间注入
<bean id="user" class="cn.spring.entity.User" p:id="3" p:username="刘三"></bean>
基于setter注入,代表参数必须有set方法
Spring Aop和Spring Ioc(一)的更多相关文章
- 【Spring AOP】Spring AOP的使用方式【Q】
Spring AOP的三种使用方式 经典AOP使用方式 改进XML配置方式 基于注解的方式 第1种方式可以作为理解spring配置AOP的基础,是最原始的配置方式,也体现了spring处理的过程. 使 ...
- 【Spring AOP】Spring AOP之如何通过注解的方式实现各种通知类型的AOP操作进阶篇(3)
一.切入点表达式的各种类型 切入点表达式的作用:限制连接点的匹配(满足时对应的aspect方法会被执行) 1)execution:用于匹配方法执行连接点.Spring AOP用户可能最经常使用exec ...
- 【Spring AOP】Spring AOP之你必须知道的AOP相关概念(1)
一.什么是AOP AOP(Aspect-oriented Programming)即面向切面编程,是对OOP( Object-oriented Programming)即面向对象编程的一种补充,AOP ...
- Spring Aop和Spring Ioc(二)
Spring IOC: DI注入集合类型: 实体类: package cn.spring.entity; import java.util.*; public class Dientity { pri ...
- Spring AOP (Spring 3.x 企业应用开发实战读书笔记第六章)
从面相对象编程到面相切面编程,是一种代码组织方式的进化. 每一代的代码组织方式,其实是为了解决当时面对的问题.比如写编译器和写操作系统的时候的年代当然要pop,比如写界面的时候当然要oop,因为界面这 ...
- Java Spring AOP用法
Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...
- Spring AOP 简介
Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...
- spring AOP的学习
1.Spring常用的概念 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点. Pointcut(切入点): ...
- spring AOP 之一:spring AOP功能介绍
一.AOP简介 AOP:是一种面向切面的编程范式,是一种编程思想,旨在通过分离横切关注点,提高模块化,可以跨越对象关注点.Aop的典型应用即spring的事务机制,日志记录.利用AOP可以对业务逻辑的 ...
随机推荐
- C++静态成员函数小结
类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: ...
- dosbox,masm的挂载
masm文件夹下 1 asm文件夹用来存储asm文件 2 几个masm的应用程序 3 masm 生成的Obj文件和Link生成的exe文件 在dosbox目录下修改option文件加入 这样开始dos ...
- sql中常量和变量的引用
String name =jtf.getText().trim(); String sql="select * from stu where stuname=' "+name+& ...
- 林大妈的JavaScript进阶知识(二):JS异步行为
JavaScript 是单线程执行的 JavaScript运行在浏览器中.浏览器是多线程的,但只分配了其中一条给JavaScript,作为它的主线程.对于编码者来说,JavaScript是单线程的.因 ...
- Luinx安装RocketMQ
一.RocketMQ环境 准备两台虚拟机,分别为master01 和master02 二.安装JDK(两台虚拟机相同步骤) 1. 检查当前虚拟机环境有没有JDK rpm -qa|grep java ( ...
- Netty学习(2):IO模型之NIO初探
NIO 概述 前面说到 BIO 有着创建线程多,阻塞 CPU 等问题,因此为解决 BIO 的问题,NIO 作为同步非阻塞 IO模型,随 JDK1.4 而出生了. 在前面我们反复说过4个概念:同步.异步 ...
- GDAL利用地理坐标读取图像像元值
最近的一个项目需要在电子海图中下载已知水深点,导出点的地理坐标(经纬度).然后在arcgis中打开这些地理坐标输出为shp,利用GDAL读取不同波段的点对应的像元值,从而构建水深和像元值的对应关系. ...
- 突破CRUD | 万能树工具类封装
0.学完本文你或许可以收获 感受一个树工具从初始逐步优化完善的过程 树工具封装的设计思考与实现思路 最后收获一款拿来即用的树工具源代码 对于前端树组件有一定了解和使用过的同学可直接跳跃到第3章节开始. ...
- LeetCode 684. Redundant Connection 冗余连接(C++/Java)
题目: In this problem, a tree is an undirected graph that is connected and has no cycles. The given in ...
- Hapi+MySql项目实战自动化文档生成(四)
自动化生成swagger文档 使用hapi插件hapi-swagger,简单配置下插件,先修改下plugin_config.js文件: //plugin_config.js const Swagger ...