Spring IOC 四种依赖注入
前期准备
-
1、创建一个Maven工程
-
2、创建一个实体类
public class User { private Integer id; private String userName; private String password; private String note; public User setId(Integer id) { this.id = id; return this; } public User setUserName(String userName) { this.userName = userName; return this; } public User setPassword(String password) { this.password = password; return this; } public User setNote(String note) { this.note = note; return this; } //注意 :toString,get方法自行实现, }
-
3、引入pom依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.1.RELEASE</version> </dependency>
-
4、在src/main/java中创建beans.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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> </beans>
一、静态工厂
-
1、首先创建一个静态工厂UserFactory
public class UserFactory { private static User user; public static User getInstance() { if(user == null) { user = new User(); user.setId(1).setUserName("王五").setPassword("hwy499").setNote("无"); } return user; } }
-
2、在Beans.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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!-- factory-method : 获得对象的静态方法名 class:静态工厂类的全限定类名--> <bean class="com.factory.UserFactory" factory-method="getInstance" id ="userFactory"> </bean> </beans>
-
3、测试
public class UserFactoryTest { public static void main(String[] args) { // 加载 beans.xml ClassPathXmlApplicationContext cpac = new ClassPathXmlApplicationContext("beans.xml"); // 获得实例 User user = cpac.getBean("userFactory", User.class); // 打印 System.out.println(user); //User [id=1, userName=王五, password=hwy499, note=无] } }
二、实例工厂注入
-
1、创建一个工厂类UserFactory
public class UserFactory { private User user; public User getInstance() { if (user == null) { user = new User(); user.setId(1).setUserName("王五").setPassword("hwy499").setNote("无"); } return user; } }
-
2、在beans.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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean class="com.factory.UserFactory" id="userFactory"> </bean> <bean class="com.bean.User" factory-bean="userFactory" factory-method="getInstance" id = "user"> </bean> </beans>
-
3、测试
public class UserFactoryTest { public static void main(String[] args) { //加载 beans.xml ClassPathXmlApplicationContext cpac = new ClassPathXmlApplicationContext("beans.xml"); //User user = cpac.getBean("userFactory", User.class); User user = cpac.getBean("user",User.class); System.out.println(user); //User [id=1, userName=王五, password=hwy499, note=无] } }
三、Set 方法注入
-
1、在beans.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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!--通过set方法注入 为什么这种方法叫做通过set方法注入呢? 这个跟我们在property标签中添加的name有关,在property中添加的name 并不是我们实体类中的属性名,而是我们在其中添加的set方法中set之后的名字, 假如我们现在实体类中有一个属性叫name,而它对应的set方法为setUserName, 那么我就要在property标签中添加name="username",而不是name="name" --> <bean id="user" class="com.bean.User"> <property name="id" value="1" /> <property name="userName" value="李四" /> <property name="password" value="123456123" /> <property name="note" value="我是一个备注" /> </bean> </beans>
-
2、测试
public class SetTest { public static void main(String[] args) { //加载 beans.xml ClassPathXmlApplicationContext cpac = new ClassPathXmlApplicationContext("beans.xml"); //User user = cpac.getBean("userFactory", User.class); User user = cpac.getBean("user",User.class); System.out.println(user); //User [id=1, userName=王五, password=hwy499, note=无] } }
四、通过构造方法注入
-
1、在实体类添加构造方法
public User(){} //无参构造函数 public User(Integer id, String userName, String password, String note) { super(); this.id = id; this.userName = userName; this.password = password; this.note = note; }
-
2、在bens.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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="user" class="com.bean.User"> <constructor-arg name="id" value="1" /> <constructor-arg name="userName" value="李四" /> <constructor-arg name="password" value="123456" /> <constructor-arg name="note" value="无备注消息" /> </bean> <!--或是--> <bean id="user1" class="com.bean.User"> <constructor-arg index="0" value="1" /> <constructor-arg index="1" value="李四" /> <constructor-arg index="2" value="123456" /> <constructor-arg index="3" value="无备注消息" /> </bean> <!--在或是 此时要注意先后问题,此时是按照你的构造函数的参数顺序依次赋值--> <bean id="user2" class="com.bean.User"> <constructor-arg value="1" /> <constructor-arg value="李四" /> <constructor-arg value="123456" /> <constructor-arg value="无备注消息" /> </bean> </beans>
-
3、测试
public class ConstructorTest { public static void main(String[] args) { //加载 beans.xml ClassPathXmlApplicationContext cpac = new ClassPathXmlApplicationContext("beans.xml"); //User user = cpac.getBean("userFactory", User.class); User user = cpac.getBean("user",User.class); System.out.println(user); // User [id=1, userName=李四, password=123456, note=无备注消息] } }
我的公众号