Spring获取对象(基本Bean配置,工厂方式获取对象),生命周期配置

版权声明:《==study hard and make progress every day==》 https://blog.csdn.net/qq_38225558/article/details/83247135

1.无参构造创建对象

<bean id=”标识” class=”完全限定名”/>

2.工厂方式创建对象

静态工厂:<bean id=”” class=”工厂类的完全限定名” factory-method=”工厂中创建对象的方法名” />

实例工厂:

<bean id=”” class=”工厂类的完全限定名”/>

<bean id=”” factory-bean=”工厂类的id” factory-method=”工厂中创建对象的方法名” />


bean类

public class User {
	private Integer id;
	public User() {}
	public Integer getId() {
		return id;
	}
	public User(Integer id) {
		this.id = id;
	}
	@Override
	public String toString() {
		return "User [id=" + id + "]";
	}
	public void init(){
		System.out.println("===初始化===");
	}
	public void destroy(){
		System.out.println("===销毁===");
	}
}

配置文件

<?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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
 	http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- 
		基本Bean配置:
		id属性:标识配置的bean,唯一且不能有特殊符号【Spring3.2前】
		name属性:和id功能相同,但可以使用特殊符号,Spring3.2后不区分id,name
		class属性:配置bean的完全限定名
		spring的生命周期:构造 -> 初始化->运行-> 销毁
		配置多例的情况下,不会执行销毁,一般我们自己不会来配置这个生命周期。
		而这个基本上Spring自身来使用,例如在Spring操作连接池的时候,它会在DateSource销毁的时候执行。
		init-method="init" ==》初始化
		destroy-method="destroy"  ==》销毁
 	-->
	<bean name="user" class="com.zhengqing.bean.User" init-method="init" destroy-method="destroy" ></bean>


	<!-- 
		Spring静态工厂方式获取对象:
	        相当于传统的代码:User user = StaticFactory.getUser(); 
	    factory-bean属性:用于工厂模式创建对象的形式,使用定义的工厂类的id
		factory-method属性:工厂类中用于创建对象的方法
    -->
<!-- 	<bean id="user2" class="com.zhengqing.factory.StaticFactory" factory-method="getUser" ></bean> -->

	<!--
	 	Spring实例工厂方式获取对象 
  		相当于传统代码:InstanceFactory factory = new InstanceFactory(); User user = factory2.getUser();
  		factory-bean属性:用于工厂模式创建对象的形式,使用定义的工厂类的id
		factory-method属性:工厂类中用于创建对象的方法
  	-->
<!-- 	<bean id="factory" class="com.zhengqing.factory.InstanceFactory" ></bean>
     	<bean id="user3" factory-bean="factory" factory-method="getUser" ></bean> -->

</beans>

测试类:

public class UserTest {

	@SuppressWarnings("deprecation")
	@Test  //BeanFactory测试获取对象
	public void test1() {
		ClassPathResource resource = new ClassPathResource("application.xml");// 获取配置文件
		XmlBeanFactory factory = new XmlBeanFactory(resource);// 获取BeanFactory的工厂对象
		User u = (User) factory.getBean("user");// 从工厂中获取到对象
		u.setId(666);
		System.out.println(u);
	}

	@Test  //使用自定义的静态工厂获取到user对象
	public void testStaticFctory() throws Exception {
		//①传统方式
		User user = StaticFactory.getUser();
		user.setId(1);
		System.out.println(user);

		//②使用Spring获取静态工厂创建的对象
		ClassPathResource resource = new ClassPathResource("application.xml");// 获取配置文件
		XmlBeanFactory factory = new XmlBeanFactory(resource);// 获取BeanFactory的工厂对象
		User u = (User) factory.getBean("user2");// 从工厂中获取到对象
		u.setId(2);
		System.out.println(u);
	}

	@Test //使用自定义的实例工厂获取到user对象
	public void testInstanceFctory() throws Exception {
		//①传统方式
		InstanceFactory factory2 = new InstanceFactory(); 
		User user = factory2.getUser(); 
		user.setId(1);
		System.out.println(user);

		//②使用Spring获取静态工厂创建的对象
		ClassPathResource resource = new ClassPathResource("application.xml");// 获取配置文件
		XmlBeanFactory factory = new XmlBeanFactory(resource);// 获取BeanFactory的工厂对象
		User u = (User) factory.getBean("user3");// 从工厂中获取到对象
		u.setId(2);
		System.out.println(u);
	}

	@Test //测试自定义的初始化和销毁方法
	public void testInitAndDestory() throws Exception {
		AbstractApplicationContext context = new ClassPathXmlApplicationContext("application.xml");// 获取配置文件
		User u = (User) context.getBean("user");// 从工厂中获取到对象
		System.out.println("没有设置值:"+u);
		u.setId(1);
		System.out.println("设置值:"+u);
		
		User u2 = (User) context.getBean("user");
		System.out.println(u2);
		context.registerShutdownHook();//关闭spring容器
	}

}

猜你喜欢

转载自blog.csdn.net/qq_38225558/article/details/83247135