使用Spring框架入門一:基於XML配置的IOC/DI的使用
阿新 • • 發佈:2018-05-05
測試結果 plugins rac prepare lombok ray instance private mls
一、Spring框架
1、方法一:逐項導入基礎依賴包:
spring-core、spring-beans、spring-context、spring-expression
2、方法二:最簡潔的導入,直接導入spring-context包:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency>
在pom.xml中加入上spring-context的依賴,它便會自動導入上述四個包。
3、參考本項目結構圖:
二、操作案例
1、建立幾個類對象,便於測試。
package test1; import lombok.Data; @Data public class User { private String name; private int age; publicvoid add() { System.out.println("user add method executed."); } }
註意,此類中,使用了lombok框架的@Data方式來實現的Getter和Setter和無參構造函數。引入lombok的方法是添加下列依賴,並為Idea安裝一個lombok的插件,並啟動註釋的編譯:
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency>
2、建立一個非靜態的工廠類,用於測試非靜態工廠方式創建Bean。
package test1; public class UserFactory { public User createUser() { User user = new User(); user.setAge(12); user.setName("張三"); return user; } }
3、再創建一個的工廠類,添加一個靜態方法,用於測試靜態方法創建Bean。
package test1; public class UserStaticFactory { public static User createUser() { User user = new User(); user.setAge(22); user.setName("張五"); return user; } }
4、再建立一個Student類,用來測試多種不同構造函數的情況:
package test1; import lombok.Data; import java.util.List; import java.util.Map; @Data public class Student { private final String name; private final int age; private List<User> users; private User user; private Map<String, String> map; public Student(String name, int age) { this.name = name; this.age = age; } public Student(User user) { this.user = user; this.name = "另外一個有參數構建Name1"; this.age = 2; } public Student(List<User> users) { this.users = users; this.name = "另外一個有參數構建Name2"; this.age = 33; } public Student(Map<String, String> map) { this.map = map; this.name = "另外一個有參數構建Name2"; this.age = 33; } }
5、在Maven項目的resources中添加一個xml,官方建議命名為:applicationContext.xml,我們為了方便做多項測試,因此就故意起個別的名字,比如:applicationContextTest1.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.xsd"> <!--方式一:直接創建--> <bean id="myUser1" class="test1.User"> <property name="name" value="songxingzhu"/> <property name="age" value="10"/> </bean> <!--方式二:非靜態工廠創建--> <bean id="userFactory" class="test1.UserFactory"/> <!--使用scope設置為prototype(默認為singleton)讓每次產生新實例--> <bean id="myUser2" factory-bean="userFactory" factory-method="createUser" scope="prototype"> <property name="name" value="修改後的Name"/> </bean> <!--方式三:靜態方法創建--> <bean id="myUser3" class="test1.UserStaticFactory" factory-method="createUser"></bean> <!--構建函數的情況一:普通參數 --> <bean id="myStudent1" class="test1.Student"> <constructor-arg name="name" value="Sindrol"/> <constructor-arg name="age" value="23"/> </bean> <!--構建函數的情況二:Bean --> <bean id="myStudent2" class="test1.Student"> <constructor-arg name="user" type="test1.User" ref="myUser3"/> </bean> <!--構建函數的情況三:Map --> <bean id="myStudent3" class="test1.Student"> <constructor-arg name="map"> <map key-type="java.lang.String" value-type="java.lang.String"> <entry key="key1" value="value1"/> <entry key="key2" value="value2"/> </map> </constructor-arg> </bean> <!--構建函數的情況四:List --> <bean id="myStudent4" class="test1.Student"> <constructor-arg name="users"> <array> <ref bean="myUser1"/> <ref bean="myUser2"/> </array> </constructor-arg> </bean> </beans>
6、調用Spring框架
(1)調用代碼:
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import test1.Student; import test1.User; public class BeanTest { @Test public void test1() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextTest1.xml"); User myUser1 = (User) context.getBean("myUser1"); System.out.println(myUser1); User myUser2 = (User) context.getBean("myUser2"); System.out.println(myUser2); User myUser2_2 = (User) context.getBean("myUser2"); System.out.println("[user2==myUser2_2]:" + (myUser2 == myUser2_2)); User myUser3 = (User) context.getBean("myUser3"); System.out.println(myUser3); Student student1 = (Student) context.getBean("myStudent1"); System.out.println(student1); Student student2 = (Student) context.getBean("myStudent2"); System.out.println(student2); Student student3 = (Student) context.getBean("myStudent3"); System.out.println(student3); Student myStudent4 = (Student) context.getBean("myStudent4"); System.out.println(myStudent4); } }
(2)測試結果:
"C:\Program Files\Java\jdk1.8.0_161\bin\java" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar=9042:D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\lib\idea_rt.jar;D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\plugins\junit\lib\junit-rt.jar;D:\Application\DevTools\JetBrains\IntelliJ IDEA 2018.1\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;D:\Projects\JavaProjects\StudyDemo\SpringDemo\target\test-classes;C:\Users\Sindrol\.m2\repository\org\springframework\spring-context\5.0.5.RELEASE\spring-context-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-aop\5.0.5.RELEASE\spring-aop-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-beans\5.0.5.RELEASE\spring-beans-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-core\5.0.5.RELEASE\spring-core-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-jcl\5.0.5.RELEASE\spring-jcl-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\org\springframework\spring-expression\5.0.5.RELEASE\spring-expression-5.0.5.RELEASE.jar;C:\Users\Sindrol\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Sindrol\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\Sindrol\.m2\repository\org\projectlombok\lombok\1.16.20\lombok-1.16.20.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 BeanTest,test1 五月 05, 2018 7:47:45 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@22a71081: startup date [Sat May 05 19:47:45 CST 2018]; root of context hierarchy 五月 05, 2018 7:47:45 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [applicationContextTest1.xml] User(name=songxingzhu, age=10) User(name=修改後的Name, age=12) [user2==myUser2_2]:false User(name=張五, age=22) Student(name=Sindrol, age=23, users=null, user=null, map=null) Student(name=另外一個有參數構建Name1, age=2, users=null, user=User(name=張五, age=22), map=null) Student(name=另外一個有參數構建Name2, age=33, users=null, user=null, map={key1=value1, key2=value2}) Student(name=另外一個有參數構建Name2, age=33, users=[User(name=songxingzhu, age=10), User(name=修改後的Name, age=12)], user=null, map=null)
使用Spring框架入門一:基於XML配置的IOC/DI的使用