【Spring in action】依赖注入DI和AOP切面

【Spring in action】读书笔记

一些基础知识:

一、不用Spring依赖注入的举例:

Knight

package test01;

public interface Knight {
	void embarkOnQuest();
}

Quest

package test01;

public interface Quest {
	void embark();
}
BraveKnight
package test01;

public class BraveKnight implements Knight{
	
	private Quest quest;
	
	public BraveKnight(Quest quest) {
		this.quest = quest;
	}
	
	@Override
	public void embarkOnQuest() {
		quest.embark();
	}
	
}

SlaveDragonQuest

public class SlaveDragonQuest implements Quest{
	
	@Override
	public void embark() {
		System.out.println("我是恐龙骑士");
	}
	
}

NoSpringTest

package test01;

public class NoSpringTest {

	public static void main(String[] args) {
		System.out.println("---------非Spring---------");
		Quest mockQuest = new SlaveDragonQuest();
		BraveKnight knight = new BraveKnight(mockQuest);
		knight.embarkOnQuest();
	}

}

---------非Spring---------

我是恐龙骑士


二、依赖注入的举例:

applicationContext.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
	<bean id="knight" class="test01.BraveKnight">
		<constructor-arg ref="quest"></constructor-arg>
	</bean>
	<bean id="quest" class="test01.SlaveDragonQuest"></bean>

</beans>

SpringTest

package test01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

	public static void main(String[] args) {
		System.out.println("---------Spring---------");
		ApplicationContext ctx = new ClassPathXmlApplicationContext("test01/applicationContext.xml");
		BraveKnight bKnight = (BraveKnight) ctx.getBean("knight");
		bKnight.embarkOnQuest();
	}

}

---------Spring---------

八月 15, 2017 4:08:57 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1f17ae12: startup date [Tue Aug 15 16:08:57 CST 2017]; root of context hierarchy

八月 15, 2017 4:08:57 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [test01/applicationContext.xml]

我是恐龙骑士

目录结构和导包如下:


优点:spring 通过它的配置,了解组件如何装配起来的。可以不改变所依赖类的情况下,修改依赖关系。

三、不使用AOP的日志举例:

Knight

public interface Knight {
	void embarkOnQuest();
}

Quest

public interface Quest {
	void embark();
}

SlaveDragonQuest

public class SlaveDragonQuest implements Quest{
	
	@Override
	public void embark() {
		System.out.println("我是恐龙骑士,屠龙ing");
	}
	
}
BraveKnight

public class BraveKnight implements Knight{
	
	private Quest quest;
	private Minstrel minstrel;
	public BraveKnight(Quest quest,Minstrel minstrel) {
		this.quest = quest;
		this.minstrel = minstrel;
	}
	
	@Override
	public void embarkOnQuest() {
		minstrel.singBeforeQuest();
		quest.embark();
		minstrel.singAfterQuest();
	}
	
}

Minstrel

public class Minstrel {
	public void singBeforeQuest(){
		System.out.println("吟游诗人:啊,伟大的骑士要去屠龙了!");
	}
	public void singAfterQuest(){
		System.out.println("吟游诗人:伟大的骑士已经屠龙归来!");
	}
}

NoSpringTest

public class NoSpringTest {

	public static void main(String[] args) {
		System.out.println("---------非Spring---------");
		Quest mockQuest = new SlaveDragonQuest();
		Minstrel minstrel = new Minstrel();
		BraveKnight knight = new BraveKnight(mockQuest,minstrel);
		knight.embarkOnQuest();
	}

}

---------非Spring---------

吟游诗人:啊,伟大的骑士要去屠龙了!

我是恐龙骑士,屠龙ing

吟游诗人:伟大的骑士已经屠龙归来!


四、AOP举例:

Knight

public interface Knight {
	void embarkOnQuest();
}

Quest

public interface Quest {
	void embark();
}

SlaveDragonQuest

public class SlaveDragonQuest implements Quest{
	
	@Override
	public void embark() {
		System.out.println("我是恐龙骑士,屠龙ing");
	}
	
}
BraveKnight
public class BraveKnight implements Knight{
	
	private Quest quest;
//	把吟游诗人做的所有事情都从骑士屠龙的事件中摘除去
//	private Minstrel minstrel;并删掉掉构造方法中Minstrel minstrel
	public BraveKnight(Quest quest) {
		this.quest = quest;
//		this.minstrel = minstrel;
	}
	
	@Override
	public void embarkOnQuest() {
//		minstrel.singBeforeQuest();
		quest.embark();
//		minstrel.singAfterQuest();
	}
	
}

Minstrel

public class Minstrel {
	public void singBeforeQuest(){
		System.out.println("吟游诗人:啊,伟大的骑士要去屠龙了!");
	}
	public void singAfterQuest(){
		System.out.println("吟游诗人:伟大的骑士已经屠龙归来!");
	}
}
applicationContext.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
	<bean id="knight" class="test03.BraveKnight">
		<constructor-arg ref="quest"></constructor-arg>
	</bean>
	<bean id="quest" class="test03.SlaveDragonQuest"></bean>
	
	<bean id="minstrel" class="test03.Minstrel"></bean>
	
	<aop:config>
		<aop:pointcut expression="execution(* test03.BraveKnight.embarkOnQuest())" id="embark"/>
		<aop:aspect ref="minstrel">
			<aop:before method="singBeforeQuest" pointcut-ref="embark"/>
			<aop:after method="singAfterQuest" pointcut-ref="embark"/>
		</aop:aspect>
	</aop:config>
</beans>

SpringTest

public class SpringTest {

	public static void main(String[] args) {
		System.out.println("---------Spring---------");
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("test03/applicationContext.xml");
		//ctx.getBean(Knight.class)与ctx.getBean("knight")的区别
		Knight bKnight = ctx.getBean(Knight.class);
		bKnight.embarkOnQuest();
		ctx.close();
	}

}

目录结构:


---------Spring---------

八月 15, 2017 5:24:17 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@37bba400: startup date [Tue Aug 15 17:24:17 CST 2017]; root of context hierarchy

八月 15, 2017 5:24:17 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [test03/applicationContext.xml]

吟游诗人:啊,伟大的骑士要去屠龙了!

我是恐龙骑士,屠龙ing

吟游诗人:伟大的骑士已经屠龙归来!

八月 15, 2017 5:24:17 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose

信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@37bba400: startup date [Tue Aug 15 17:24:17 CST 2017]; root of context hierarchy























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值