标签:使用 讲解 after poi .com path xmla context 另一个
Spring的两个核心特性:
依赖注入(dependency injection,DI)
先声明两个接口People与Fruit。
public interface People {// people接口 void eat(); } public interface Fruit {// 水果接口 void speak(); }
接下来是分别实现他们的类Watermelon与Student。
public class Watermelon implements Fruit{// 西瓜类 @Override public void speak() { System.out.println("我是西瓜,我要被吃掉了!"); } } public class Student implements People {// 学生类 private Fruit fruit; public Student(Fruit fruit) {// 构造器注入依赖的对象 this.fruit = fruit; } @Override public void eat() { fruit.speak(); } }
到这里我们可以看出Student类依赖Watermelon类。当调用Student的eat方法时需要调用Watermelon的speak方法。
我们接下来用XML对这两个应用组件进行装配(wiring)。
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--水果声明为Spring的bean--> <bean id="fruit" class="com.qsh.springaction.Watermelon"/> <!--人声明为Spring的bean--> <bean id="people" class="com.qsh.springaction.Student"> <constructor-arg ref="fruit"/> </bean> </beans>
最后我们进行测试。用spring上下文全权负责对象的创建和组装。
public class TestEat { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("eat.xml"); People people = context.getBean(People.class); people.eat(); context.close(); } }
测试结果。
面向切面编程(aspect oriented programming,AOP)
我们还是有上面的Student 和 Watermelon类。需要新增加一个Action类,就是一会的切面。
public class Action {// 行为类 public void beforeEat() { System.out.println("吃前拿刀,嚓嚓嚓"); } public void afterEat() { System.out.println("吃后洗手,哗哗哗"); } }
需要在XML中加入Spring AOP命名空间,将Action方法声明为Spring的bean,然后切面引用这个bean。切点为student的eat方法,在切点前后加入前置通知和后置通知。
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"> <!--水果声明为Spring的bean--> <bean id="fruit" class="com.qsh.springaction.Watermelon"/> <!--人声明为Spring的bean--> <bean id="people" class="com.qsh.springaction.Student"> <constructor-arg ref="fruit"/> </bean> <!--行为声明为Spring的bean--> <bean id="action" class="com.qsh.springaction.Action"/> <!--用spring aop的命名空间把Action声明为一个切面--> <aop:config> <!--引用Action的bean--> <aop:aspect ref="action"> <!--声明Student的eat方法为一个切点--> <aop:pointcut id="eating" expression="execution(* *.eat(..))"/> <!--前置通知,在调用eat方法前调用Action的beforeEat方法--> <aop:before pointcut-ref="eating" method="beforeEat"/> <!--后置通知,在调用eat方法后调用Action的afterEat方法--> <aop:after pointcut-ref="eating" method="afterEat"/> </aop:aspect> </aop:config> </beans>
运行结果为:
标签:使用 讲解 after poi .com path xmla context 另一个
原文地址:https://www.cnblogs.com/JimKing/p/8759132.html