目的 達到 鬆耦合(loose coupling)
DI 取到的物件為 Design Pattern Singleton 模式
參考:
https://openhome.cc/Gossip/DesignPattern/SingletonPattern.htm
沒有Spring的世界,萬物(件)皆得new()一下
package course.c01; public class HelloWorldBean { public String sayHello() { return "Hello World"; } }
package course.c01.di.xmlBased; import course.c01.HelloWorldBean; public class HelloWorldBeanMain { public static void main(String[] args) { HelloWorldBean helloWorldBean1 = new HelloWorldBean(); System.out.println(helloWorldBean1.sayHello()); HelloWorldBean helloWorldBean2 = new HelloWorldBean(); System.out.println(helloWorldBean2.sayHello()); System.out.println( "helloWorldBean1 == helloWorldBean2 :" + (helloWorldBean1 == helloWorldBean2)); } }
Hello World Hello World helloWorldBean1 == helloWorldBean2 :false
有Spring的世界,new() 不見了
<?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"> <bean id="helloWorldBean" class="course.c01.HelloWorldBean" /> </beans> <!-- course/c01/di/xmlBased/applicationContext.xml -->
package course.c01.di.xmlBased; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import course.c01.HelloWorldBean; public class HelloWorldBeanMain { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "course/c01/di/xmlBased/applicationContext.xml"); HelloWorldBean helloWorldBean1 = context.getBean(HelloWorldBean.class); System.out.println(helloWorldBean1.sayHello()); HelloWorldBean helloWorldBean2 = context.getBean(HelloWorldBean.class); System.out.println(helloWorldBean2.sayHello()); System.out.println( "helloWorldBean1 == helloWorldBean2 :" + (helloWorldBean1 == helloWorldBean2)); } }
一月 23, 2020 2:58:51 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 資訊: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@581cdfc2: startup date [Thu Jan 23 14:58:51 CST 2020]; root of context hierarchy 一月 23, 2020 2:58:51 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 資訊: Loading XML bean definitions from class path resource [course/c01/di/xmlBased/applicationContext.xml] Hello World Hello World helloWorldBean1 == helloWorldBean2 :true
看到這裡,就可以知道Spring控管的物件,絕對不可以寫 變數 Feld,不然會有悲劇
package course.c01; public class HelloWorldBean { private String name; public void setName(String name) { this.name = name; } public String sayHello() { return "Hello World" + this.name; } }
package course.c01.di.xmlBased; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import course.c01.HelloWorldBean; public class HelloWorldBeanMain { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "course/c01/di/xmlBased/applicationContext.xml"); HelloWorldBean helloWorldBean1 = context.getBean(HelloWorldBean.class); helloWorldBean1.setName("SameChen.io"); System.out.println(helloWorldBean1.sayHello()); HelloWorldBean helloWorldBean2 = context.getBean(HelloWorldBean.class); System.out.println(helloWorldBean2.sayHello()); System.out.println( "helloWorldBean1 == helloWorldBean2 :" + (helloWorldBean1 == helloWorldBean2)); } }
一月 23, 2020 3:30:26 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 資訊: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4fa666bf: startup date [Thu Jan 23 15:30:26 CST 2020]; root of context hierarchy 一月 23, 2020 3:30:26 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 資訊: Loading XML bean definitions from class path resource [course/c01/di/xmlBased/applicationContext.xml] Hello World SameChen.io Hello World SameChen.io helloWorldBean1 == helloWorldBean2 :trueSpring除了XML配置外,還可以使用java類別配置
package course.c01.di.javaBased; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import course.c01.HelloWorldBean; @Configuration public class HelloWorldBeanConfig { @Bean public HelloWorldBean getHelloWorldBean() { return new HelloWorldBean(); } }
package course.c01.di.javaBased; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import course.c01.HelloWorldBean; public class HelloWorldBeanMain { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldBeanConfig.class); HelloWorldBean helloWorldBean1 = context.getBean(HelloWorldBean.class); helloWorldBean1.setName("SameChen.io"); System.out.println(helloWorldBean1.sayHello()); HelloWorldBean helloWorldBean2 = context.getBean(HelloWorldBean.class); System.out.println(helloWorldBean2.sayHello()); System.out.println( "helloWorldBean1 == helloWorldBean2 :" + (helloWorldBean1 == helloWorldBean2)); } }
一月 23, 2020 3:44:53 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh 資訊: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@432b71eb: startup date [Thu Jan 23 15:44:53 CST 2020]; root of context hierarchy Hello World SameChen.io Hello World SameChen.io helloWorldBean1 == helloWorldBean2 :true