SpringBean的配置详解
- Bean的实例化配置
- Spring的实例化方法主要由以下两种
-
构造方法实例化
-
底层通过构造方法对bean进行实例化
- 构造方法实例化bean又分为无参方法实例化和有参方法实例化,在Spring中配置的<bean>几乎都是无参构造该方式,默认是无参构造方法,在此处不赘述。下面讲解有参构造方法实例化Bean
- 在配置文件中为有参构造方法中的参数指定值
-
<?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="userService" class="com.example.Service.Impl.UserServiceImpl"> <constructor-arg name="name" value="hahaha"></constructor-arg> <property name="userDAO" ref="userDAO"></property> </bean> <bean id="userDAO" class="com.example.DAO.UserDAO"></bean> </beans>
-
package com.example.Service.Impl; import com.example.DAO.UserDAO; import com.example.Service.UserService; public class UserServiceImpl implements UserService { // todo 无参构造方法 public UserServiceImpl() { System.out.println("无参构造方法"); } // todo 有参构造方法 public UserServiceImpl(String name) { System.out.println("有参构造方法"); System.out.println(name); } private UserDAO userDAO; public void setUserDAO(UserDAO userDAO) { } }
-
测试类运行结果
-
package com.example.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestApplicationContext { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); Object userService1 = context.getBean("userService"); System.out.println(userService1); context.close(); } }
-
- 构造方法实例化bean又分为无参方法实例化和有参方法实例化,在Spring中配置的<bean>几乎都是无参构造该方式,默认是无参构造方法,在此处不赘述。下面讲解有参构造方法实例化Bean
-
工厂方法实例化Bean
- 底层通过自定义的工厂方法对Bean进行实例化
-
静态工厂方法实例化Bean
- 自定义一个工厂,工厂内部自定义静态方法,在状态方法内部产生一个bean,最后bean交给Spring容器管理
- 创建一个类,在该类中完成对象的创建,然后交给Spring容器管理,对象的创建前后,设置一些逻辑代码
- 工厂类代码
-
package com.example.Factory; import com.example.DAO.Impl.UserDAOImpl; import com.example.DAO.UserDAO; public class MyBeanFactory1 { public static UserDAO userDAO() { // todo 设置创建对象前的逻辑代码 return new UserDAOImpl(); // todo 设置创建对象后的逻辑代码 } }
-
-
配置类中的关键代码
-
<bean id="userDAO1" class="com.example.Factory.MyBeanFactory1" factory-method="userDAO"></bean>
设置userDAO1的bean对象,且是指定类中UserDAO方法返回值作为该bean对象,而不是指定的类
-
-
测试类
-
package com.example.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestApplicationContext { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); Object userDAO1 = context.getBean("userDAO1"); System.out.println(userDAO1); } }
-
-
运行结果如下
-
-
实例工厂方法实例化Bean
- 工厂内部的方法是非静态的。(需要工厂对象进行(由此要配置工厂对象)方法调用)
- 由此配置代码如下
-
<!-- todo 配置工厂对象--> <bean id="BeanFactory2" class="com.example.Factory.MyBeanFactory2"></bean> <!-- 设置工厂方法返回的bean对象--> <bean id="userDAO2" factory-bean="BeanFactory2" factory-method="userDAO"></bean>
-
- 由此配置代码如下
- 工厂内部的方法是非静态的。(需要工厂对象进行(由此要配置工厂对象)方法调用)
-
实现FactoryBean接口,延迟实例化Bean
-
package com.example.Factory; import com.example.DAO.Impl.UserDAOImpl; import com.example.DAO.UserDAO; import org.springframework.beans.factory.FactoryBean; public class MyBeanFactory3 implements FactoryBean<UserDAO> { @Override public UserDAO getObject() throws Exception { return new UserDAOImpl(); } @Override public Class<?> getObjectType() { return UserDAO.class; } }
-
-
配置文件
-
<bean name="userDAO3" class="com.example.Factory.MyBeanFactory3"></bean>
-
-
测试类
-
package com.example.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestApplicationContext { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); Object userDAO = context.getBean("userDAO3"); System.out.println(userDAO); } }
- (只有在调用getBean()方法时才会对bean对象进行实例化)
-
-
-
- Spring的实例化方法主要由以下两种
在上述文章中,工厂类中的方法都是无参方法。
下面介绍工厂类中的方法为有参方法
- 工厂类及其方法
package com.example.Factory;
import com.example.DAO.Impl.UserDAOImpl;
import com.example.DAO.UserDAO;
public class MyBeanFactory1 {
public static UserDAO userDAO(String name) {
System.out.println(name);
return new UserDAOImpl();
}
}
- 配置文件
<bean id="userDAO1" class="com.example.Factory.MyBeanFactory1" factory-method="userDAO">
<constructor-arg name="name" value="hkm"></constructor-arg>
</bean>
依然使用的是 <constructor-arg>标签
- 运行测试类
package com.example.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestApplicationContext {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Object userDAO1 = context.getBean("userDAO1");
System.out.println(userDAO1);
}
}
- 运行结果