/** * @Author:jimisun * @Description: * @Date:Created in 20:32 2018-09-26 * @Modified By: */ public class HelloSpringBean { public String sayHello() { return "Hello Spring!!!"; } }
你能夠看到,這就是一個POJO(簡單的JAVA類),沒有任何地方代表它是Spring組件,Spring非侵入式編程模型意味着這個類在Spring應用和非Spring應用中均可以發揮一樣的做用。儘管看起來很簡單;但Spring經過IOC(Inversion of Control)管理這個POJO,而後經過DI(Dependency Inject)來注入他們,這個POJO就變的魔力十足;那麼DI是如何幫助應用對象彼此之間保持鬆耦合的呢?html
/** * @Author:jimisun * @Description: * @Date:Created in 07:44 2018-09-27 * @Modified By: */ public class BeautifulGirl implements Gril { private EatAction eat;
public BeautifulGirl() { this.eat = new EatAction(); } @Override public void action() { eat.action(); } }
在BeautifulGirl(可愛的小女孩)這個類中,在構造方法中建立一個EatAction(吃飯動做)。這樣就極大限制了BeautifulGirl(可愛的小女孩)的能力;若是如今小女孩須要去玩耍呢?或者須要去睡覺呢?真是太抱歉了,BeautifulGirl(可愛的小女孩)只會吃東西這個動做。這是什麼緣由呢?這就是BeautifulGirl(可愛的小女孩)和EatAction(吃飯動做)這兩個類牢牢耦合在了一塊兒!緊密耦合同時會形成代碼的難以測試,難以服用,難以理解,而且典型地表現出"打地鼠「式的Bug特性(修復一個Bug,將會出現一個或多個新Bug),因此咱們能夠知道耦合是必須的,但必須謹慎管理耦合,可是怎麼纔算是謹慎處理耦合關係呢?java
/** * @Author:jimisun * @Description: * @Date:Created in 07:44 2018-09-27 * @Modified By: */ public class BeautifulGirl implements Gril { private Action action; public BeautifulGirl(Action action) { this.action = action; } @Override public void action() { action.action(); } }
從上面實例代碼中能夠看到BeautifulGirl自己並無建立任何的動做,而是經過構造方法傳入一個實現了Action(動做)接口的實現類便可,也就是說BeautifulGirl能夠完成任意實現了Action接口的動做(睡覺啦...玩耍啦...旅行啦....)。這裏的要點是BeautifulGirl沒有與任何特定的Action發生耦合。BeautifulGirl只須要的是一個實現Action接口就行,對象自己只是經過接口(而非具體實現或初始化過程)來代表依賴關係,那麼這種依賴就可以在BeautifulGirl不知情的狀況下替換不一樣的具體動做。好了咱們如今明白了DI進行依關係解耦的原理了,下面咱們看一下如何在Spring中應用DI。 example4實例源碼下載git
<?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-4.0.xsd"> <bean class="com.jimisun.spring.example4.BeautifulGirl" id="beautifulGirl"> <constructor-arg ref="action"/> </bean> <bean class="com.jimisun.spring.example4.SleepAction" id="action"></bean> </beans>
/** * @Author:jimisun * @Description: * @Date:Created in 07:53 2018-09-27 * @Modified By: */ public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml"); BeautifulGirl beautifulGirl = (BeautifulGirl) context.getBean("beautifulGirl"); beautifulGirl.action(); context.close(); } }
這樣執行Main方法,從Context中獲取BeautifulGirl實例執行action方法。固然Spring提供了基於Java的配置,可做爲XML配置文件的代替方案 example5實例源碼下載github
/** * @Author:jimisun * @Description: * @Date:Created in 08:40 2018-09-27 * @Modified By: */ @Configuration public class SpringConfig { @Bean public SleepAction sleepAction() { return new SleepAction(); } @Bean public BeautifulGirl beautifulGirl() { return new BeautifulGirl(sleepAction()); } }
/** * @Author:jimisun * @Description: * @Date:Created in 07:53 2018-09-27 * @Modified By: */ public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class); SleepAction action = applicationContext.getBean(SleepAction.class); action.action(); } }
/** * @Author:jimisun * @Description: * @Date:Created in 09:32 2018-09-27 * @Modified By: */ public class Parent { public void check() { System.out.println("檢查動做是否安全......."); } }
很是簡單!Parent(家長類)只有一個方法就是check,那麼如今就讓Parent對BeautifulGirl的執行動做進行檢查吧。spring
<bean class="com.jimisun.spring.example6.BeautifulGirl" id="beautifulGirl"> <constructor-arg ref="action"/> <constructor-arg ref="parent"/> </bean> <bean class="com.jimisun.spring.example6.SleepAction" id="action"></bean> <bean class="com.jimisun.spring.example6.Parent" id="parent"></bean> </beans>
/** * @Author:jimisun * @Description: * @Date:Created in 07:44 2018-09-27 * @Modified By: */ public class BeautifulGirl implements Girl { private Action action; private Parent parent; public BeautifulGirl(Action action, Parent parent) { this.action = action; this.parent = parent; } @Override public void action() { parent.check(); action.action(); } }
<!--聲明Bean--> <bean class="com.jimisun.spring.example7.Parent" id="parent"></bean> <!--聲明切面--> <aop:config> <aop:aspect ref="parent"> <aop:pointcut id="girlAction" expression="execution(* com.jimisun.spring.example7.Action.*(..))"/> <aop:before pointcut-ref="girlAction" method="check"/> </aop:aspect> </aop:config>
/** * @Author:jimisun * @Description: * @Date:Created in 07:44 2018-09-27 * @Modified By: */ public class BeautifulGirl implements Girl { private Action action; public BeautifulGirl(Action action) { this.action = action; } @Override public void girlAction() { action.action(); } }
/** * @Author:jimisun * @Description: * @Date:Created in 11:13 2018-09-27 * @Modified By: */ public class Main { public static void main(String[] args) { JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.execute("select * from user"); } }