Spring----工厂注入和bean的生命周期

本文内容纲要:

- 独立的集合bean

- P名空间

- 静态工厂注入

- 实例工厂注入

- bean之间的依赖关系

- 生命周期" title="bean的生命周期">bean的生命周期

- 使用注解配置:

独立的集合bean

在多个bean之间可共享该独立bean。

示例:

<bean id="car1" class="com.entity.Car">

<property name="brand" value="BMW"/>

<property name="color" value="白色"/>

</bean>

<bean id="car2" class="com.entity.Car">

<property name="brand" value="BENZ"/>

<property name="color" value="红色"/>

</bean>

<bean id="car3" class="com.entity.Car">

<property name="brand" value="AUDI"/>

<property name="color" value="黑色"/>

</bean>

<util:list id="mycars">

<ref bean="car1"/>

<ref bean="car2"/>

<ref bean="car3"/>

</util:list>

在其他bean中即可共享该mycars--bean。

<bean name="stu,s1,s2" class="com.entity.Students">

<property name="cars">

<ref bean="mycars"/>

</property>

</bean>

P名空间

使用p命名空间时需要先声明使用对应的命名空间,即在beans元素上加入:

xmlns:p="http://www.springframework.org/schema/p"

使用p命名空间的好处是简化配置信息。

示例:

<bean id="car1" class="com.entity.Car" p:brand="BMW" p:color="白色"/>

<bean id="car2" class="com.entity.Car" p:brand="BENZ" p:color="红色"/>

<bean id="car3" class="com.entity.Car" p:brand="AUDI" p:color="黑色"/>

静态工厂注入

使用的是工厂中的静态方法。

在service层引用的dao,1.可以使用原始的方式注入,2.也可以使用静态工厂注入,自己编写一个工厂类,里面静态方法返回一个dao的实现类对象。

静态工厂BinessDAOFactory:

package com.factory;

import com.dao.CarDAO;

import com.dao.StudentsDAO;

import com.dao.impl.CarDAOImpl;

import com.dao.impl.StudentsDAOImpl;

public class BinessDAOFactory {

//获得学生的DAO实例

public static StudentsDAO getStudentsDAOImplInstance(){

return new StudentsDAOImpl();

}

//获得汽车的DAO实例、

public static CarDAO getCarDAOImplInstance(){

return new CarDAOImpl();

}

//获得用户的DAO实例

/*public static UsersDAO getUsersDAOImplInstance(){

return new UsersDAOImpl();

}*/

}

applicationContext.xml:

<!-- 一个学生bean -->

<bean id="s" class="com.entity.Students" p:sid="s0001" p:name="金泰妍" p:gender="女" p:birthday="1989-03-09" p:address="韩国"/>

<!-- 学生dao bean -->

<bean id="sDao" class="com.factory.BinessDAOFactory"

factory-method="getStudentsDAOImplInstance">//静态方法

</bean>

<!-- 学生service bean -->

<bean id="sService" class="com.service.impl.StudentsServiceImpl">

<property name="studentsDAO" ref="sDao"></property>

</bean>

测试:

@Test

public void fun1(){

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

Students s=(Students) ctx.getBean("s");

//System.out.println(s);

StudentsServiceImpl sService=(StudentsServiceImpl) ctx.getBean("sService");

sService.add(s);

}

实例工厂注入

工厂:

public class BinessDAOFactory {

//获得学生的DAO实例

public StudentsDAO getStudentsDAOImplInstance(){

return new StudentsDAOImpl();

}

}

applicationContext.xml:

<!-- 工厂bean的注入 -->

<bean id="businessFactory" class="com.factory.BinessDAOFactory"></bean>

<!-- 实例工厂注入--得到dao的bean -->

<bean id="sDao1" factory-bean="businessFactory" factory-method="getStudentsDAOImplInstance">

</bean>

<!-- 学生service bean -->

<bean id="sService" class="com.service.impl.StudentsServiceImpl">

<property name="studentsDAO" ref="sDao1"></property>

</bean>

测试:

public class StudentServiceImplTest {

@Test

public void fun1(){

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

Students s=(Students) ctx.getBean("s");

//System.out.println(s);

StudentsServiceImpl sService=(StudentsServiceImpl) ctx.getBean("sService");

sService.add(s);

}

}

bean之间的依赖关系

在Students类中加上Car car这个属性字段。

<!-- 一个学生bean -->

<bean id="s" class="com.entity.Students" p:sid="s0001" p:name="金泰妍" p:gender="女" p:birthday="1989-03-09" p:address="韩国" p:car-ref="c" depends-on="c"/>

<bean id="c" class="com.entity.Car" p:brand="BWM" p:color="白色"/>

学生bean依赖汽车bean,在初始化的时候会先初始化Car。

bean的生命周期

1.懒加载,在用到该bean的时候,才会去初始化它,加载它。

Students.java:

package com.entity;

import java.io.Serializable;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.List;

import javax.annotation.PostConstruct;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.stereotype.Component;

//加注解注入,起一个别名s1

@Component("haha")

public class Students implements Serializable {

private String sid;// 学号

private String name;// 姓名

private String gender;// 性别

private Date birthday;// 生日

private String address;// 住址

private Car car;// 学生拥有的车的引用

// private List<Car> cars;

//初始化方法,在构造方法之后调用

public void initStudents(){

System.out.println("执行学生的initStudents()方法");

}

//在ApplicationContext对象被销毁的时候执行

public void destroyStudents(){

System.out.println("执行学生的destroyStudents()方法");

}

public Students(String sid, String name, String gender, Date birthday,

String address) {

super();

this.sid = sid;

this.name = name;

this.gender = gender;

this.birthday = birthday;

this.address = address;

}

public Students(String sid, String name, String gender, Date birthday,

String address, Car car) {

super();

this.sid = sid;

this.name = name;

this.gender = gender;

this.birthday = birthday;

this.address = address;

this.car = car;

}

public Car getCar() {

return car;

}

public void setCar(Car car) {

this.car = car;

}

public Students(String sid, String name, String gender, String address) {

this.sid = sid;

this.name = name;

this.gender = gender;

this.address = address;

}

/*//解决方法1:

//在构造方法之后执行一些初始化的操作

@PostConstruct

public void init(){

//在调用完构造函数之后,birthday还为null,然后使用这个直接赋值

try {

this.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2000-05-17"));

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}*/

public Students() {

System.out.println("一个学生创建啦...");

}

public String getSid() {

return sid;

}

// @Value("s0006")

public void setSid(String sid) {

this.sid = sid;

}

public String getName() {

return name;

}

// @Value("IU")

public void setName(String name) {

System.out.println("执行了setName()方法");

this.name = name;

}

public String getGender() {

return gender;

}

// @Value("女")

public void setGender(String gender) {

this.gender = gender;

}

public Date getBirthday() {

return birthday;

}

// @Value("1998-07-15")

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public String getAddress() {

return address;

}

// @Value("韩国首尔")

public void setAddress(String address) {

this.address = address;

}

@Override

public String toString() {

return "Students [sid=" + sid + ", name=" + name + ", gender=" + gender

+ ", birthday=" + birthday + ", address=" + address + ", car="

+ car + "]";

}

}

applicationContext.xml:

<!-- 一个学生bean -->

<bean id="s" class="com.entity.Students" p:sid="s0001" p:name="金泰妍" p:gender="女" p:birthday="1989-03-09" p:address="韩国" p:car-ref="c" depends-on="c" lazy-init="true" init-method="initStudents" destroy-method="destroyStudents" scope="prototype"/>

<bean id="c" class="com.entity.Car" p:brand="BWM" p:color="白色"/>

测试:

public class StudentServiceImplTest {

@Test

public void fun1(){

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

Students s=(Students) ctx.getBean("s");

Students ss=(Students) ctx.getBean("s");

System.out.println(s==ss);//单例:true prototype:false

//System.out.println(s);

StudentsServiceImpl sService=(StudentsServiceImpl) ctx.getBean("sService");

sService.add(s);

((ClassPathXmlApplicationContext)ctx).close();

}

}


使用注解配置:

Students.java:

package com.entity;

import java.io.Serializable;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.List;

import javax.annotation.PostConstruct;

import javax.annotation.PreDestroy;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.DependsOn;

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Component;

//加注解注入,起一个别名s1

@Component("s")

@DependsOn(value="car")//依赖关系

@Scope("prototype")//得到的bean对象是否为单例的singleton,prototype

public class Students implements Serializable {

private String sid;// 学号

private String name;// 姓名

private String gender;// 性别

private Date birthday;// 生日

private String address;// 住址

private Car car;// 学生拥有的车的引用

// private List<Car> cars;

//初始化方法,在构造方法之后调用

@PostConstruct//初始化方法

public void initStudents(){

System.out.println("执行学生的initStudents()方法");

}

//在ApplicationContext对象被销毁的时候执行

@PreDestroy//销毁方法

public void destroyStudents(){

System.out.println("执行学生的destroyStudents()方法");

}

public Students(String sid, String name, String gender, Date birthday,

String address) {

super();

this.sid = sid;

this.name = name;

this.gender = gender;

this.birthday = birthday;

this.address = address;

}

public Students(String sid, String name, String gender, Date birthday,

String address, Car car) {

super();

this.sid = sid;

this.name = name;

this.gender = gender;

this.birthday = birthday;

this.address = address;

this.car = car;

}

public Car getCar() {

return car;

}

@Resource(name="car")

public void setCar(Car car) {

this.car = car;

}

public Students(String sid, String name, String gender, String address) {

this.sid = sid;

this.name = name;

this.gender = gender;

this.address = address;

}

/*//解决方法1:

//在构造方法之后执行一些初始化的操作

@PostConstruct

public void init(){

//在调用完构造函数之后,birthday还为null,然后使用这个直接赋值

try {

this.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2000-05-17"));

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}*/

public Students() {

System.out.println("一个学生创建啦...");

}

public String getSid() {

return sid;

}

@Value("s0006")

public void setSid(String sid) {

this.sid = sid;

}

public String getName() {

return name;

}

@Value("IU")

public void setName(String name) {

System.out.println("执行了setName()方法");

this.name = name;

}

public String getGender() {

return gender;

}

@Value("女")

public void setGender(String gender) {

this.gender = gender;

}

public Date getBirthday() {

return birthday;

}

@Value("1998-07-15")

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public String getAddress() {

return address;

}

@Value("韩国首尔")

public void setAddress(String address) {

this.address = address;

}

@Override

public String toString() {

return "Students [sid=" + sid + ", name=" + name + ", gender=" + gender

+ ", birthday=" + birthday + ", address=" + address + ", car="

+ car + "]";

}

}

Car.java:

package com.entity;

import java.io.Serializable;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

//注解注入,,之后的实例名称叫car

@Component("car")

public class Car implements Serializable{

private String brand;// 品牌

private String color;// 颜色

public Car() {

System.out.println("一辆汽车诞生啦...");

}

public Car(String brand, String color) {

super();

this.brand = brand;

this.color = color;

}

public String getBrand() {

return brand;

}

@Value("BMW")

public void setBrand(String brand) {

this.brand = brand;

}

public String getColor() {

return color;

}

@Value("黑色")

public void setColor(String color) {

this.color = color;

}

@Override

public String toString() {

return "Car [brand=" + brand + ", color=" + color + "]";

}

}

<?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"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:util="http://www.springframework.org/schema/util"

xmlns:cache="http://www.springframework.org/schema/cache"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

http://www.springframework.org/schema/util

http://www.springframework.org/schema/util/spring-util-4.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-4.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

http://www.springframework.org/schema/cache

http://www.springframework.org/schema/cache/spring-cache-4.0.xsd">

<!-- 表示使用注解 -->

<context:annotation-config/>

<!-- 扫描带注解的包 -->

<context:component-scan base-package="com.entity"/>

<!-- 实现类型转换的bean -->

<!-- id的名字必须是这个 -->

<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">

<property name="propertyEditorRegistrars">

<list>

<bean class="com.convert.MyCustomDateEditorRegister">

<property name="format" value="yyyy-MM-dd"></property>

</bean>

</list>

</property>

</bean>

<bean id="dateFormat" class="java.text.SimpleDateFormat">

<constructor-arg value="yyyy-MM-dd"/>

</bean>

<!-- 一个学生bean -->

<!-- <bean id="s" class="com.entity.Students" p:sid="s0001" p:name="金泰妍" p:gender="女" p:birthday="1989-03-09" p:address="韩国" p:car-ref="c" depends-on="c" lazy-init="true" init-method="initStudents" destroy-method="destroyStudents" scope="prototype"/>

<bean id="c" class="com.entity.Car" p:brand="BWM" p:color="白色"/> -->

<!-- 静态工厂注入 学生dao bean -->

<!-- <bean id="sDao" class="com.factory.BinessDAOFactory"

factory-method="getStudentsDAOImplInstance">

</bean> -->

<!-- 工厂bean的注入 -->

<bean id="businessFactory" class="com.factory.BinessDAOFactory"></bean>

<!-- 实例工厂注入##得到dao的bean -->

<bean id="sDao1" factory-bean="businessFactory" factory-method="getStudentsDAOImplInstance">

</bean>

<!-- 学生service bean -->

<bean id="sService" class="com.service.impl.StudentsServiceImpl">

<property name="studentsDAO" ref="sDao1"></property>

</bean>

</beans>

测试:

package com.service.impl;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.AbstractApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.entity.Students;

public class StudentServiceImplTest {

@Test

public void fun1(){

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

Students s=(Students) ctx.getBean("s");

Students ss=(Students) ctx.getBean("s");

System.out.println(s==ss);//单例:true prototype:false

//System.out.println(s);

StudentsServiceImpl sService=(StudentsServiceImpl) ctx.getBean("sService");

sService.add(s);

((ClassPathXmlApplicationContext)ctx).close();

}

}

本文内容总结:独立的集合bean,P名空间,静态工厂注入,实例工厂注入,bean之间的依赖关系,bean的生命周期,使用注解配置:,

原文链接:https://www.cnblogs.com/xjs1874704478/p/11202876.html

以上是 Spring----工厂注入和bean的生命周期 的全部内容, 来源链接: utcz.com/z/362482.html

回到顶部