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可以对业务逻辑的 ...
随机推荐
- Codeforces 1087C Connect Three (思维+模拟)
题意: 网格图选中三个格,让你选中一些格子把这三个格子连起来,使得选中的格子总数最小.最后输出方案 网格范围为1000 思路: 首先两点间连起来最少需要的格子为他们的曼哈顿距离 然后连接方案一定是曼哈 ...
- Go语言实现:【剑指offer】按之字形打印二叉树
该题目来源于牛客网<剑指offer>专题. 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. ...
- 论文《Entity Linking with Effective Acronym Expansion, Instance Selection and Topic Modeling》
Entity Linking with Effective Acronym Expansion, Instance Selection and Topic Modeling 一.主要贡献 1. pro ...
- pinpoint安装(docker)
安装docker docker-compose yum update -y yum install docker epel-release python-pip -y pip install --up ...
- Django (一) 基础
创建项目 创建app python manager.py startapp app01 修改.添加url from django.conf.urls import url,include fr ...
- 1,Python爬虫环境的安装
前言 很早以前就听说了Python爬虫,但是一直没有去了解:想着先要把一个方面的知识学好再去了解其他新兴的技术. 但是现在项目有需求,要到网上爬取一些信息,然后做数据分析.所以便从零开始学习Pytho ...
- Django框架的初使用-2
目录 Django框架的初使用-1 1 Django MVT回顾 2 模型M 2.1 ORM框架 2.2 模型设计 3 视图V 3.1 定义视图函数 3.2 配置URLconf 3.3 视图-匹配过程 ...
- leetcode--js--Two Sum
问题描述: 给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = ...
- asp.net core 3.x Identity
一.前言 这方面的资料很多,重复的写没必要,但是最近一直在学习身份验证和授权相关东东,为了成体系还是写一篇,主要是从概念上理解identity系统. 参考:https://www.cnblogs.co ...
- 简化MVVM属性设置和修改 - .NET CORE(C#) WPF开发
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 简化MVVM属性设置和修改 - .NET CORE(C#) WPF开发 阅读导航 常用类属性设 ...