spring 对象创建 bean

spring bean三种创建方式

空参构造

<bean  name="user" class="leitao.zhang.entities.User"></bean>

静态工厂

<bean  name="staticuser" class="leitao.zhang.spring.UserFactory" factory-method="createUser"></bean>
public class UserFactory {

   public static User createUser()
   { 
	   System.out.println("静态工厂");
	   return new User();
   }
}

实例工厂

<bean  name="UserFactory" class="leitao.zhang.spring.UserFactory"></bean>
<bean  name="insuser" factory-bean="UserFactory" factory-method="createUser2"></bean>

public class UserFactory {
   public User createUser2()
   {
	   System.out.println("实例工厂");
	   return new User();
   }
}

 

bean 之 scope

<bean  name="user" class="leitao.zhang.entities.User" scope="singleton"></bean>

singleton 单利模式(默认) 容器中只会存在一个 绝大多数要用默认

prototype 多例 每次都new 整合struts2时要配置为改值 ActionContext 每次访问都要创建

request:web环境下,对象和request生命周期一直

session:web环境下,对像与session周期一样

bean之生命周期

<bean  name="user" class="leitao.zhang.entities.User" init-method="init" destroy-method="destory"></bean>

init-method=”init”:配置一个方法作为生命周期的初始化方法,spring会在对象创建之后立即调用

destory-method=”destory” :配置一个方法作为生命周期销毁方法,spring容器会在关闭并销毁所有中期中的对象时调用

 

分模块配置

导入其它配置文件

<beans>
      <import resource="leitao/zhang/entities/springBean.xml"/>
</beans>

spring属性注入

set方式注入

	<bean name="order" class="leitao.zhang.entities.Order">
		<!-- 值类型 -->
		<property name="id" value="d123456"></property>
		<property name="price" value="123"></property>
		<!-- 引用类型 -->
		<property name="user" ref="user"></property>
	</bean>
	<bean  name="user" class="leitao.zhang.entities.User">
		<property name="name" value="张三"></property>
		<property name="age" value="12"></property>
	</bean>

构造注入

index 指定参数索引位置

type 指定参数类型(完全限定类名)

value 值类型的值

ref引用类型bean

	<bean name="order1" class="leitao.zhang.entities.Order">
		<constructor-arg name="id" index="0" type="java.lang.String" value="d456987"></constructor-arg>
		<constructor-arg name="price" index="1" type="java.lang.Double" value="65423"></constructor-arg>
		<constructor-arg name="user" index="2" type="leitao.zhang.entities.User" ref="user"></constructor-arg>
	</bean>

p命名空间注入

在跟元素引入 命名空间 xmlns:p=”http://www.springframework.org/schema/p”

<bean name="order2" class="leitao.zhang.entities.Order" p:id="d65478" p:price="365.65" p:user-ref="user"></bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "
	>
	<bean name="order" class="leitao.zhang.entities.Order">
		<!-- 八大基本数据类型 -->
		<property name="id" value="d123456"></property>
		<property name="price" value="123"></property>
		<!-- 引用类型 -->
		<property name="user" ref="user"></property>
	</bean>
	<bean  name="user" class="leitao.zhang.entities.User">
		<property name="name" value="张三"></property>
		<property name="age" value="12"></property>
	</bean>
	
	<bean name="order1" class="leitao.zhang.entities.Order">
		<constructor-arg name="id" index="0" type="java.lang.String" value="d456987"></constructor-arg>
		<constructor-arg name="price" index="1" type="java.lang.Double" value="65423"></constructor-arg>
		<constructor-arg name="user" index="2" type="leitao.zhang.entities.User" ref="user"></constructor-arg>
	</bean>

	<bean name="order2" class="leitao.zhang.entities.Order" p:id="d65478" p:price="365.65" p:user-ref="user"></bean>

</beans>

spel注入 spring express language

格式:#{beanName.beanProperty}

	<bean name="order3" class="leitao.zhang.entities.Order"> 
		<property name="id" value="#{order.id}"></property>
		<property name="price" value="456"></property>
		<!-- 引用类型 -->
		<property name="user" ref="user"></property>
	</bean>

属性复杂类型注入

bean:

package leitao.zhang.entities;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class CollectionBean {

	private Object[] arr;
	private Object[] arr2; 
	private List list;
	private Map map;
	private Set set;
	private Properties properties;
	
	public CollectionBean() {
		super();
	}
	public Object[] getArr() {
		return arr;
	}
	public void setArr(Object[] arr) {
		this.arr = arr;
	}
	public Object[] getArr2() {
		return arr2;
	}
	public void setArr2(Object[] arr2) {
		this.arr2 = arr2;
	}
	
	public Set getSet() {
		return set;
	}
	public void setSet(Set set) {
		this.set = set;
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public Map getMap() {
		return map;
	}
	public void setMap(Map map) {
		this.map = map;
	}
	public Properties getProperties() {
		return properties;
	}
	public void setProperties(Properties properties) {
		this.properties = properties;
	}
	@Override
	public String toString() {
		return "CollectionBean [arr=" + Arrays.toString(arr) + ", arr2=" + Arrays.toString(arr2) + ", list=" + list
				+ ", map=" + map + ", set=" + set + ", properties=" + properties + "]";
	}
 
}

xml:

<bean name="cb" class="leitao.zhang.entities.CollectionBean">
		<!-- 数组只有一个值 -->
		<property name="arr" value="4568"></property>
		<!-- 数组多个值 -->
		<property name="arr2">
			<array> 
				<value>6589</value>
				<value>#{order2}</value>
				<ref bean="order3"/>
			</array>
		</property>
		<!-- list和数组一样 -->
		<property name="list">
			<list>
				<value>6584</value>
				<ref bean="user"/>
				<value>#{user.name}</value>
			</list>
		</property>
		<!-- map -->
		<property name="map">
			<map>
				<entry key="#{user.name}" value="战斗"></entry>
				<entry key="ade" value-ref="order"></entry>
				<entry key-ref="user" value-ref="order"></entry>
			</map>
		</property>
		
		<property name="set">
			<set>
				<value>#{order}</value>
				<value>#{user.name}</value>
				<ref bean="order1"/>
				<array>
					<value>98</value>
				</array>
			</set>
		</property>
		<!-- Properties -->
		<property name="properties"> 
			<props>
				<prop key="driverClass">com.jdbc.mysql.Driver</prop>
				<prop key="userName">root</prop>
				<prop key="password">root</prop>
			</props>
		</property>
		
	</bean>

 

java:

package leitao.zhang.spring;
 
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import leitao.zhang.entities.CollectionBean;
import leitao.zhang.entities.Order;
import leitao.zhang.entities.User;

public class Demo1 {

//	/**
//	 * bean entitis 空参构造
//	 */
//	@Test
//	public void fun1()
//	{
//		
//		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//		User bean = (User) ac.getBean("user");
//		System.out.println(bean);
//	}
//	/**
//	 * 静态工厂
//	 */
//	@Test
//	public void fun2()
//	{
//		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//		User bean = (User) ac.getBean("staticuser");
//		System.out.println(bean);
//		
//	}
//	/**
//	 * 实例工厂
//	 */
//	@Test
//	public void fun3()
//	{
//		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//		User bean = (User) ac.getBean("insuser");
//		System.out.println(bean);
//		
//	}
//	
//	
//	
//	/**
//	 * 生命周期==初始化销毁方法
//	 */
//	@Test
//	public void fun4()
//	{
//		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//		User bean = (User) ac.getBean("user");
//		ac.close();
//		System.out.println(bean);
//		
//	}
	
	/**
	 * set注入
	 */
	@Test
	public void fun5()
	{
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Order bean = (Order) ac.getBean("order");
		ac.close();
		System.out.println(bean);
		
	}
	/**
	 * 构造注入
	 */
	@Test
	public void fun6()
	{
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Order bean = (Order) ac.getBean("order1");
		ac.close();
		System.out.println(bean);
		
	}
	
	/**
	 * p命名空间注入
	 */
	@Test
	public void fun7()
	{
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Order bean = (Order) ac.getBean("order2");
		ac.close();
		System.out.println(bean);
		
	}
	/**
	 * spel spring expresess language 注入
	 */
	@Test
	public void fun8()
	{
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Order bean = (Order) ac.getBean("order3");
		ac.close();
		System.out.println(bean);
		
	}
	
	/**
	 * 属性复杂类型注入
	 */
	@Test
	public void fun9()
	{
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		CollectionBean bean = (CollectionBean) ac.getBean("cb");
		ac.close();
		System.out.println(bean);
		
	}
}

 

Spring,struts2整合到web

  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
  	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

在 struts2 Action中获取ApplicationContext对象

		WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
		Order bean = (Order) context.getBean("order1");
		ActionContext.getContext().put("order", bean);

 

未经允许不得转载:开心乐窝-乐在其中 » spring 对象创建 bean

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏