【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