bean标签:
作用:
用于配置对象让spring来创建的。 默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
属性:
id:给对象在容器中提供一个唯一标识。用于获取对象。 不能重复,否则报错。
name:name是bean的名称标识,在网上看到有的文章说name可以重复,但是我在Srping 4.0.4.RELEASE测试中,bean标签的name属性也是不能重复,且id和name属性也不能重复,name标签应该等同于id属性。
class:指定类的全限定类名(全类名=包+类)。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。 * singleton :默认值,单例的. * prototype :多例的.
* request :WEB项目中,Spring创建一个Bean的对象,将对象存入到request域中.
* session :WEB项目中,Spring创建一个Bean的对象,将对象存入到session域中.
* global session :WEB项目中,应用在Portlet环境.如果没有Portlet环境那么globalSession相当于session.
init-method:指定类中的初始化方法名称。init-method属性是bean的初始方法,在创建好bean后调用该方法。
destroy-method:指定类中销毁方法名称。destory-method属性是bean的销毁方法,在销毁bean之前调用该方法,一般在该方法中释放资源。
factory-method:工厂方法属性,通过该属性,我们可以调用一个指定的静态工厂方法,创建bean实例。
// 首先要创建生成bean的工厂类和方法
public class BeanAttribute {
public static void main(String[] args) {
ApplicationContext act = new ClassPathXmlApplicationContext("BeanAttribute.xml");
User user = (User) act.getBean("userFactory");
System.out.println(user);
}
/**
* 静态工厂方法生成user对象
* @return
*/
public static User createUser() {
return new User();
}
}
<%--然后创建bean实例--%>
<bean id="userFactory" class="lzgsea.factory.BeanAttribute" factory-method="createUser"></bean>
上述代码就相当于:
User user = BeanAttribute.createUser();
factory-bean:就是生成bean的工厂对象,factory-bean属性和factory-method属性一起使用。
// 首先要创建生成bean的工厂类和方法。
public class UserFactory {
// 生产user对象的工程方法
public User createUser() {
return new User();
}
}
// 创建user对象,在java代码中我们这样写:
UserFactory userFactory = new UserFactory();
User user = userFactory.createUser();
如果要在Spring中创建User对象:首先在xml配置中配置UserFactory类和User类
<!--在Spring中我们怎么写-->
<!--首先在XML配置中配置UserFactory类和User类:-->
<bean id="userFactory" class="lzgsea.factory.UserFactory"></bean>
<bean id="user" factory-bean="userFactory" factory-method="createUser"></bean>
然后getBean获取User对象
ApplicationContext act = new ClassPathXmlApplicationContext("BeanAttribute.xml");
User user = (User) act.getBean("user");
System.out.println(user);
bean的作用范围和生命周期:
单例对象:
scope="singleton" 一个应用只有一个对象的实例。它的作用范围就是整个引用。
生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
多例对象:
scope="prototype" 每次访问对象时,都会重新创建对象实例。
生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被java的垃圾回收器回收了。
实例化Bean的三种方式
(1)第一种方式:使用默认无参构造函数。在默认情况下: 它会根据默认无参构造函数来创建类对象。如果bean中没有默认无参构造函数,将会创建失败。
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"/>
(2)第二种方式:spring管理静态工厂-使用静态工厂的方法创建对象。
/**
* 模拟一个静态工厂,创建业务层实现类
*/
public class StaticFactory {
public static IAccountService createAccountService(){
return new AccountServiceImpl();
}
}
然后在xml文件中
<!-- 此种方式是:
使用StaticFactory类中的静态方法createAccountService创建对象,并存入spring容器 id属性:指定bean的id,用于从容器中获取 class属性:指定静态工厂的全限定类名 factory-method属性:指定生产对象的静态方法 -->
<bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="createAccountService"></bean>
(3)第三种方式:spring管理实例工厂-使用实例工厂的方法创建对象.
/**
* 模拟一个实例工厂,创建业务层实现类
* 此工厂创建对象,必须现有工厂实例对象,再调用方法
*/
public class InstanceFactory {
public IAccountService createAccountService(){
return new AccountServiceImpl();
}
}
然后在xml文件中
<!-- 此种方式是:
先把工厂的创建交给spring来管理。
然后在使用工厂的bean来调用里面的方法
factory-bean属性:用于指定实例工厂bean的id。
factory-method属性:用于指定实例工厂中创建对象的方法。
-->
<bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instancFactory" factory-method="createAccountService"></bean>