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可以对业务逻辑的 ...
随机推荐
- CCF_ 201312-3_最大的矩形
遍历数组中每一元素,左右延伸得出宽度. #include<iostream> #include<cstdio> using namespace std; int main() ...
- mongodb副本集群搭建
一.环境介绍 1.机器信息 10.40.6.68 10.40.6.108 10.40.6.110 软件环境为centos 6.x 2.mongodb 下载链接地址 https://www.mongod ...
- Ambari HDP 下 SPARK2 与 Phoenix 整合
1.环境说明 操作系统 CentOS Linux release 7.4.1708 (Core) Ambari 2.6.x HDP 2.6.3.0 Spark 2.x Phoenix 4.10.0-H ...
- aws 社交媒体技术大会 部分总结
早上会议总结:. 1. 介绍了aws的应用,无技术知识点.略 2. 云原生: 就是一种在云中原生的一种技术 新常态:已经成为一种常态,基本都有的服务都可以部署在云端. 对 “互联网+” 和 “+互联 ...
- zabbix-mysql迁移分离
io过高,迁移mysql 停掉zabbix 导出数据库的zabbix库 导入到新机器,并启动mysql 1:修改zabbix_server.conf文件里DB相关的地址,用户名和密码. vim /et ...
- H5异步加载多图
异步加载多图(可能没啥用,加载慢)(图片预加载,提前给浏览器缓存图片) 1. 用一个计数变量记录需要加载的图片个数 2. 用new Image()去加载,加载完给此对象的src赋值要加载的url路径( ...
- docker配置容器运行jar包
拉取jdk镜像文件 # docker pull huanwei/alpine-oraclejdk8 创建文件夹编写Dockerfile文件 # mkdir docker # vi Dockerfile ...
- vue项目中出现cannot get/的解决办法
webpack-dev-server没有配置网站根目录造成找不到可以显示的首页 配置根目录即可: devServer: { contentBase:path.resolve(__dirname,& ...
- 前端vue开发中的跨域问题解决,以及nginx上线部署。(vue devServer与nginx)
前言 最近做的一个项目中使用了vue+springboot的前后端分离模式 在前端开发的的时候,使用vue cli3的devServer来解决跨域问题 上线部署则是用的nginx反向代理至后台服务所开 ...
- C#设计模式学习笔记:(23)解释器模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8242238.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十一个模式-- ...