applicationContext.xml(spring.xml)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<import resource="spring-*.xml"></import>
<!--日志的bean-->
<bean id="log" class="com.teng.util.LogManager"></bean>
<!--配置切面和切入点信息-->
<aop:config proxy-target-class="true">
<!--
配置切入点
id:切入点名称
expression:指定切入的表达式
第一个*:代表方法的返回值类型 任意返回类型
com.teng.service.impl 包名
第二个*:任意类
第三个*:任意方法名
(..):..任意的参数类型
execution(* com.teng.service.impl.*.*(..))
-->
<aop:pointcut id="pt" expression="execution(* com.teng.service.impl.*.*(..))"></aop:pointcut>
<!--把切面和切入点关联起来 这个过程就是植入-->
<aop:advisor advice-ref="log" pointcut-ref="pt"></aop:advisor>
</aop:config>
<bean id="myLog" class="com.teng.util.Log"></bean>
<aop:config>
<!--切入点-->
<aop:pointcut id="pt1" expression="execution(* com.teng.dao.impl.*.*(..))"></aop:pointcut>
<!--自定义切面-->
<aop:aspect ref="myLog">
<!--通知 aop:before前置通知-->
<aop:before method="before" pointcut-ref="pt1"></aop:before>
<!--aop":after-returning 后置通知 方法成功返回后通知-->
<aop:after-returning method="after" pointcut-ref="pt1"></aop:after-returning>
<!--抛出异常后通知-->
<aop:after-throwing method="throwing1" pointcut-ref="pt1"></aop:after-throwing>
<!--环绕通知-->
<aop:around method="around" pointcut-ref="pt1"></aop:around>
</aop:aspect>
</aop:config>
</beans>
spring-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<import resource="spring-*.xml"></import>
<!--日志的bean-->
<bean id="log" class="com.teng.util.LogManager"></bean>
<!--配置切面和切入点信息-->
<aop:config proxy-target-class="true">
<!--
配置切入点
id:切入点名称
expression:指定切入的表达式
第一个*:代表方法的返回值类型 任意返回类型
com.teng.service.impl 包名
第二个*:任意类
第三个*:任意方法名
(..):..任意的参数类型
execution(* com.teng.service.impl.*.*(..))
-->
<aop:pointcut id="pt" expression="execution(* com.teng.service.impl.*.*(..))"></aop:pointcut>
<!--把切面和切入点关联起来 这个过程就是植入-->
<aop:advisor advice-ref="log" pointcut-ref="pt"></aop:advisor>
</aop:config>
<bean id="myLog" class="com.teng.util.Log"></bean>
<aop:config>
<!--切入点-->
<aop:pointcut id="pt1" expression="execution(* com.teng.dao.impl.*.*(..))"></aop:pointcut>
<!--自定义切面-->
<aop:aspect ref="myLog">
<!--通知 aop:before前置通知-->
<aop:before method="before" pointcut-ref="pt1"></aop:before>
<!--aop":after-returning 后置通知 方法成功返回后通知-->
<aop:after-returning method="after" pointcut-ref="pt1"></aop:after-returning>
<!--抛出异常后通知-->
<aop:after-throwing method="throwing1" pointcut-ref="pt1"></aop:after-throwing>
<!--环绕通知-->
<aop:around method="around" pointcut-ref="pt1"></aop:around>
</aop:aspect>
</aop:config>
</beans>
spring-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"
default-autowire="byType">
<bean id="userService" class="com.teng.service.impl.UserServiceImpl" autowire="default">
<!--
autowire 属性值自动装配
默认值 no 不装配
byName 通过属性名装配 前提必须有有参构造
byType 通过类型装配
default 跟随着上级的特性
-->
<!-- <property name="userDao" ref="UserDao"></property>-->
<property name="list">
<list>
<value>上海</value>
<value>广州</value>
<value>深圳</value>
</list>
</property>
</bean>
<bean id="user" class="com.teng.domain.User">
<!--
通过属性赋值
基本数据类型,String:通过value赋值
对象数据类型list:通过ref赋值
集合类型:list:通过list赋值
集合类型:set:通过set赋值
-->
<!--<property name="id" value="22"></property>-->
<!-- <constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="你好"></constructor-arg>
<constructor-arg index="2" value="hello"></constructor-arg>-->
<constructor-arg type="int" value="22"></constructor-arg>
<constructor-arg type="java.lang.String" value="牛"></constructor-arg>
<constructor-arg type="java.lang.String" value="批"></constructor-arg>
</bean>
</beans>
项目结构
UserDao接口和UserService接口
package com.teng.dao;
import com.teng.domain.User;
import java.util.List;
public interface UserDao {
public void find();
public void find(int id);
public void find(User user);
public void find(List list);
}
package com.teng.service;
import com.teng.domain.User;
import java.util.List;
public interface UserService {
public void find();
public void find(int id);
public void find(User user);
public void find(List list);
}
UserDaoImpl实现类和UserServiceImpl实现类
package com.teng.dao.impl;
import com.teng.dao.UserDao;
import com.teng.domain.User;
import java.util.List;
public class UserDaoImpl implements UserDao {
@Override
public void find() {
System.out.println("====ig 牛逼======");
}
@Override
public void find(int id) {
System.out.println("====ig 牛逼======");
}
@Override
public void find(User user) {
System.out.println("====ig 牛逼======");
}
@Override
public void find(List list) {
System.out.println("====ig 牛逼======");
}
}
package com.teng.service.impl;
import com.teng.dao.impl.UserDaoImpl;
import com.teng.domain.User;
import com.teng.service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService {
private UserDaoImpl userDao;
private List list;
@Override
public void find() {
userDao.find();
}
@Override
public void find(int id) {
userDao.find(id);
}
@Override
public void find(User user) {
userDao.find(user);
}
@Override
public void find(List list) {
userDao.find(list);
}
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
实现的方法实行前代码和方法执行后代码
LogManager
package com.teng.util;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class LogManager implements MethodBeforeAdvice, AfterReturningAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("方法执行前日志--------ig 牛逼");
}
@Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println("方法执行后日志--------ig 牛逼");
}
}
自定义日志切面类
package com.teng.util;
import org.aspectj.lang.ProceedingJoinPoint;
/*
* 自定义日志切面 不需要实现接口
* */
public class Log {
public void before(){
System.out.println("----before----");
}
public void after(){
System.out.println("----after----");
}
public void around(ProceedingJoinPoint joinPoint){
System.out.println("----around 前置-----");
try {
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("----around 后置-----");
}
public void throwing1(){
System.out.println("========throw=======");
}
}
package com.teng;
import com.teng.domain.User;
import com.teng.service.UserService;
import com.teng.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.activation.FileDataSource;
import java.util.List;
/*
* spring创建对象:代理模式
* 使用者 代理商 厂家
* user User uer = new User() User
* 静态代理 提前生产对象
* 动态代理 使用的时候生产对象
* */
public class TestUser {
@Test
public void test1(){
BeanFactory beanFactory = new ClassPathXmlApplicationContext("/spring.xml");
UserService userService = (UserService) beanFactory.getBean("userService");
userService.find();
}
@Test
public void test2(){
BeanFactory beanFactory = new ClassPathXmlApplicationContext("/spring.xml");
//jdk代理
UserService userService = (UserService) beanFactory.getBean("userService");
//cglib 代理 配置文件中
UserServiceImpl userServiceImpl = beanFactory.getBean(UserServiceImpl.class);
userService.find();
/*userService.find(11);
User user = (User) beanFactory.getBean("user");
userService.find(user);
List list = userServiceImpl.getList();
userService.find(list);*/
}
}
执行结果
在applicationContext.xml中加上
<!--开启注解扫描功能-->
<context:annotation-config></context:annotation-config>
<!--定义注解扫描的包-->
<context:component-scan base-package="com.teng"></context:component-scan>
<!--开启aop自动代理模式-->
<aop:aspectj-autoproxy proxy-target-class="true" />
在User类上加上@Component(value=“user”)//注入beanfactory中
UserDaoImpl和UserServiceImpl代码
package com.teng.dao.impl;
import com.teng.dao.UserDao;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.security.interfaces.RSAKey;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.List;
@Repository(value = "userDao")
public class UserDaoImpl implements UserDao {
@PostConstruct//定义初始化是执行的方法
public void init(){
System.out.println("11111111111111");
}
@Override
public void find() {
System.out.println("=====ig 牛逼=======");
}
@PreDestroy//定义被销毁之前执行的方法
public void destroy(){
System.out.println("222222222222");
}
}
package com.teng.service.impl;
import com.teng.dao.UserDao;
import com.teng.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service(value = "userService")
public class UserServiceImpl implements UserService {
/*
@Resource 默认情况下通过属性名称查找 id= userDao 的bean
如果通过名称找到,直接返回对应的bean
如果通过名称没有找到,然后通过类型查找 UserDao UserDaoImplb
@Resource(name = "userDao") 只通过name查找
*/
/*@Resource(name = "userDao")
private UserDao userDao;*/
/*
* @Autowired 自动装配 先找class,如果一个接口只有一个实现类,直接找到对应实现类
* 如果一个接口有多个实现类,再通过名称查找
*
* @Autowired
@Qualifier(value = "userDao")
只能通过名称查找 byName
* */
@Autowired
@Qualifier(value = "userDao")
private UserDao userDao;
@Override
public void find() {
userDao.find();
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
自定义切面类的注解
package com.teng.util;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* Created by Administrator on 2018/11/22 0022.
* 自定义日志切面 不需要实现接口
*/
@Aspect//标志是切面
@Component(value = "log")//注入beanfactory中
public class Log {
// 定义在哪个层导入切面
@Pointcut("execution(* com.teng.service.impl.*.*(..))")
public void log(){
System.out.println("++++++");
}
@Before(value = "log()")//方法执行前
public void before(){
System.out.println("-----before-----");
}
@AfterReturning(value = "log()")//方法执行后返回结果后执行
public void after(){
System.out.println("-----after-----");
}
@Around(value = "log()")//环绕
public void around(ProceedingJoinPoint joinPoint){
System.out.println("-------around 前置---------");
try {
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("-------around 后置---------");
}
}
测试结果是,在执行find方法时,执行这些方法。111111111是初始化userService时执行的。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有