Spring
编程技术  /  houtizong 发布于 3年前   155
package test;public interface PersonService { public void testPerson();}
package test;public class PersonServiceImpl implements PersonService{ private PersonDao personDao; public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } public void testPerson() { System.out.println("注入:" + personDao.testPerson()); }}
package test;public interface PersonDao { public String testPerson();}
package test;public class PersonDaoImpl implements PersonDao { public String testPerson() { return "依赖注入就是控制反转"; }}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 将PersonService类部署成Spring容器中的Bean --> <bean id="personService" class="test.PersonServiceImpl"> <property name="personDao" ref="personDao"/> </bean> <bean id="personDao" class="test.PersonDaoImpl"></bean></beans>
package test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestSpring { public static void main(String[] args) { // 创建Spring容器,一旦获得了该容器,就可通过该容器访问Spring容器中的Bean ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); System.out.println(ctx); PersonServiceImpl p = ctx.getBean("personService" , PersonServiceImpl.class); p.testPerson(); }}
package test;public class PersonServiceImpl implements PersonService{ private PersonDao personDao; // 构造注入所需的带参数的构造器 public PersonServiceImpl(PersonDao personDao) { this.personDao = personDao; } public void testPerson() { System.out.println("注入:" + personDao.testPerson()); }}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 将PersonService类部署成Spring容器中的Bean --> <bean id="personService" class="test.PersonServiceImpl"> <!-- 使用构造注入 --> <constructor-arg ref="personDao"/> </bean> <bean id="personDao" class="test.PersonDaoImpl"></bean></beans>
package lee;public class Hello { //定义一个简单方法,模拟应用中的业务逻辑方法 public void sayHello(){ System.out.println("Hello AspectJ!"); } public static void main(String[] args){ Hello h = new Hello(); h.sayHello(); }}
package lee;public aspect TxAspect{ //指定执行Hello.sayHello()方法时执行下面代码块 void around():call(void Hello.sayHello()){ System.out.println("开始事务..."); proceed(); // 调用原来的sayHello()方法 System.out.println("事务结束..."); }}
package lee;public aspect LogAspect { //定义一个PointCut,其名为logPointcut //该PointCut对应于指定Hello对象的sayHello方法 pointcut logPointcut() :execution(void Hello.sayHello()); //在logPointcut之后执行下面代码块 after():logPointcut(){ System.out.println("记录日志..."); }}
package test.service;public interface Person { public String sayHello(String name); public void eat(String food);}
package test.service.impl;import org.springframework.stereotype.*;import test.service.Person;@Componentpublic class Chinese implements Person { public String sayHello(String name) { return name + " Hello , Spring AOP"; } public void eat(String food) { System.out.println("我正在吃:" + food); }}
<?xml version="1.0" encoding="GBK"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 指定自动搜索Bean组件、自动搜索切面类 --> <context:component-scan base-package="test.service,test.advice"> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan> <!-- 启动@AspectJ支持 --> <aop:aspectj-autoproxy/></beans>
package test.advice;import org.aspectj.lang.annotation.*;//定义一个切面@Aspectpublic class BeforeAdviceTest { // 匹配test.service.impl包下所有类的、所有方法的执行作为切入点 @Before("execution(* test.service.impl.*.*(..))") public void authority() { System.out.println("1.模拟执行权限检查"); }}
package test;import org.springframework.context.*;import org.springframework.context.support.*;import test.service.*;public class BeanTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); Person p = ctx.getBean("chinese", Person.class); System.out.println(p.sayHello("张三")); p.eat("西瓜"); }}
package test.advice;import org.aspectj.lang.*;import java.util.Arrays;public class FourAdviceTest { public Object processTx(ProceedingJoinPoint jp) throws java.lang.Throwable { System.out.println("Around增强:执行目标方法之前,模拟开始事务..."); // 访问执行目标方法的参数 Object[] args = jp.getArgs(); // 当执行目标方法的参数存在, // 且第一个参数是字符串参数 if (args != null && args.length > 0 && args[0].getClass() == String.class) { // 改变第一个目标方法的第一个参数 args[0] = "被改变的参数"; } // 执行目标方法,并保存目标方法执行后的返回值 Object rvt = jp.proceed(args); System.out.println("Around增强:执行目标方法之后,模拟结束事务..."); return rvt + " 新增的内容"; } public void authority(JoinPoint jp) { System.out.println("②Before增强:模拟执行权限检查"); // 返回被织入增强处理的目标方法 System.out.println("②Before增强:被织入增强处理的目标方法为:" + jp.getSignature().getName()); // 访问执行目标方法的参数 System.out.println("②Before增强:目标方法的参数为:" + Arrays.toString(jp.getArgs())); // 访问被增强处理的目标对象 System.out.println("②Before增强:被织入增强处理的目标对象为:" + jp.getTarget()); } public void log(JoinPoint jp, Object rvt) { System.out.println("AfterReturning增强:获取目标方法返回值:" + rvt); System.out.println("AfterReturning增强:模拟记录日志功能..."); // 返回被织入增强处理的目标方法 System.out.println("AfterReturning增强:被织入增强处理的目标方法为:" + jp.getSignature().getName()); // 访问执行目标方法的参数 System.out.println("AfterReturning增强:目标方法的参数为:" + Arrays.toString(jp.getArgs())); // 访问被增强处理的目标对象 System.out.println("AfterReturning增强:被织入增强处理的目标对象为:" + jp.getTarget()); } public void release(JoinPoint jp) { System.out.println("After增强:模拟方法结束后的释放资源..."); // 返回被织入增强处理的目标方法 System.out.println("After增强:被织入增强处理的目标方法为:" + jp.getSignature().getName()); // 访问执行目标方法的参数 System.out.println("After增强:目标方法的参数为:" + Arrays.toString(jp.getArgs())); // 访问被增强处理的目标对象 System.out.println("After增强:被织入增强处理的目标对象为:" + jp.getTarget()); }}
package test.advice;public class SecondAdviceTest { // 定义Before增强处理 public void authority(String aa) { System.out.println("目标方法的参数为:" + aa); System.out.println("①号Before增强:模拟执行权限检查"); }}
<?xml version="1.0" encoding="GBK"?><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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <aop:config> <!-- 将fourAdviceBean转换成切面Bean 切面Bean的新名称为:fourAdviceAspect 指定该切面的优先级为2 --> <aop:aspect id="fourAdviceAspect" ref="fourAdviceBean" order="2"> <!-- 定义一个After增强处理, 直接指定切入点表达式 以切面Bean中的release()方法作为增强处理方法 --> <aop:after pointcut="execution(* org.crazyit.app.service.impl.*.*(..))" method="release"/> <!-- 定义一个Before增强处理, 直接指定切入点表达式 以切面Bean中的authority()方法作为增强处理方法 --> <aop:before pointcut="execution(* org.crazyit.app.service.impl.*.*(..))" method="authority"/> <!-- 定义一个AfterReturning增强处理, 直接指定切入点表达式 以切面Bean中的log()方法作为增强处理方法 --> <aop:after-returning pointcut="execution(* org.crazyit.app.service.impl.*.*(..))" method="log" returning="rvt"/> <!-- 定义一个Around增强处理, 直接指定切入点表达式 以切面Bean中的processTx()方法作为增强处理方法 --> <aop:around pointcut="execution(* org.crazyit.app.service.impl.*.*(..))" method="processTx"/> </aop:aspect> <!-- 将secondAdviceBean转换成切面Bean 切面Bean的新名称为:secondAdviceAspect 指定该切面的优先级为1,该切面里的增强处理将被优先织入 --> <aop:aspect id="secondAdviceAspect" ref="secondAdviceBean" order="1"> <!-- 定义一个Before增强处理, 直接指定切入点表达式 以切面Bean中的authority()方法作为增强处理方法 且该参数必须为String类型(由authority方法声明中msg参数的类型决定) --> <aop:before pointcut="execution(* org.crazyit.app.service.impl.*.*(..)) and args(aa)" method="authority"/> </aop:aspect> </aop:config> <!-- 定义一个普通组件Bean --> <bean id="chinese" class="org.crazyit.app.service.impl.Chinese"/> <!-- 定义一个普通Bean实例,该Bean实例将被作为Aspect Bean --> <bean id="fourAdviceBean" class="org.crazyit.app.advice.FourAdviceTest"/> <!-- 再定义一个普通Bean实例,该Bean实例将被作为Aspect Bean --> <bean id="secondAdviceBean" class="org.crazyit.app.advice.SecondAdviceTest"/></beans>
<?xml version="1.0" encoding="GBK"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 自动扫描指定包及其子包下的所有Bean类 --> <context:component-scan base-package="com.jiang.service"/></beans>
<?xml version="1.0" encoding="GBK"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 自动扫描指定包及其子包下的所有Bean类 --> <context:component-scan base-package="test"/> <!-- 只包含以ServiceImpl、DaoImpl结尾的类,满足此条件时就算没有注解也会被当成Bean处理 <context:component-scan base-package="com.jiang.service"> <context:include-filter type="regex" expression=".*ServiceImpl"/> <context:include-filter type="regex" expression=".*DaoImpl"/> </context:component-scan> --></beans>
private Test test; //设值注入所需的setter方法 @Resource(name="testName") public void setTest(Test test){ this.test = test; }
@Resource(name="testName") private Test test;
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接