本文已参与「新人创作礼」活动,一起开启掘金创作之路
名称与标识
Id:使用了约束中的唯一约束,里面不能出现特殊字符(开发中较多使用)
Name:没有使用约束中的唯一约束,也可以出现特殊字符
设置对象生命周期方法
Init-method:Bean被初始化的时候执行的方法
Destory-method:Bean被销毁的时候执行的方法,由于Bean默认是单例模式创建的,所以会在工厂关闭的时候调用销毁方法
1. 在UserDaoOrcleImpl中编写init方法和destory方法
public class UserDaoOrcleImpl implements UserDao {
@Override
public void save() {
System.out.println("orcle-save");
}
@Override
public void delete() {
System.out.println("orcle-delete");
}
public void initMethod() {
System.out.println("执行初始化方法");
}
public void destoryMethod() {
System.out.println("执行销毁方法");
}
}
2. 编写applicationContext.xml配置文件,将init方法和destory方法配置到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="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
init-method="initMethod" destroy-method="destoryMethod"/>
</beans>
3. 编写测试类
public class test {
public static void main(String[] args){
// 1、加载配置文件,调用Bean的初始化方法
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
// 2、 参数为配置文件中bean的id
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
//3、调用UserDaoMysqlImpl类中的save方法
userDao.save();
//4、关闭工厂,调用销毁方法
((ClassPathXmlApplicationContext)applicationContext).close();
}
}
4. 运行结果
Bean作用范围配置
Singleton:默认值,Spring默认采用单例模式创建对象
Prototype:多例模式
Request:应用在web项目中,Spring创建这个类以后,将这个对象存入到request范围中
Session:应用在web项目中,Spring创建这个类以后,将这个对象存入到session范围中
Globalsession:应用在web项目中,必须在porlet(基于java的web组件,子域名)环境下使用。
1、配置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">
<!--
id:为自己起的名称
class:为类的全路径
init-method:对象创建时调用的初始化方法
destory-method:对象销毁时调用的销毁方法
scope:bean的作用范围,默认为singleton
-->
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
init-method="initMethod" destroy-method="destoryMethod"
scope="singleton"/>
2、测试
public class test {
public static void main(String[] args){
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
System.out.println(userDao);
UserDao userDao1 = (UserDao)applicationContext.getBean("userDao");
System.out.println(userDao1);
}
}
3. 运行结果
将对象地址打印出来对比
scope="singleton"
scope="prototype"
从运行结果可以看出,在单例模式下,只会创建一个bean对象,因此只会调用一次初始化方法。而在多例模式下,每次getbean时都会重新创建对象,每创建一次对象都会调用一次初始化方法
工厂实例化的方式
public class test {
public static void main(String[] args){
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
}
}
1. 无参构造方法(默认)
<?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">
<!--
id:为自己起的名称
class:为类的全路径
init-method:对象创建时调用的初始化方法
destory-method:对象销毁时调用的销毁方法
scope:bean的作用范围,默认为singleton
-->
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
init-method="initMethod" destroy-method="destoryMethod"
scope="prototype" />
</beans>
public class UserDaoOrcleImpl implements UserDao {
public UserDaoOrcleImpl(){
System.out.println("执行无参构造方法");
}
@Override
public void save() {
System.out.println("orcle-save");
}
@Override
public void delete() {
System.out.println("orcle-delete");
}
public void initMethod() {
System.out.println("执行初始化方法");
}
public void destoryMethod() {
System.out.println("执行销毁方法");
}
}
从以上结果可以得知,创建对象时首先调用自己的无参构造方法,然后才调用init-method里的方法
2. 静态工厂实例化
<?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">
<!--
id:为自己起的名称
class:为类的全路径
init-method:对象创建时调用的初始化方法
destory-method:对象销毁时调用的销毁方法
scope:bean的作用范围,默认为singleton
-->
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
init-method="initMethod" destroy-method="destoryMethod"
scope="prototype" factory-method="create"/>
</beans>
public class UserDaoOrcleImpl implements UserDao {
public UserDaoOrcleImpl(){
System.out.println("执行无参构造方法");
}
public static UserDaoOrcleImpl create(){
System.out.println("执行了create方法");
return new UserDaoOrcleImpl();
}
@Override
public void save() {
System.out.println("orcle-save");
}
@Override
public void delete() {
System.out.println("orcle-delete");
}
public void initMethod() {
System.out.println("执行初始化方法");
}
public void destoryMethod() {
System.out.println("执行销毁方法");
}
}
从以上结果可以得知,创建对象时首先会调用factory-method里静态方法,然后才会调用自己的无参构造方法,最后才会调用init-method里的方法
3. 实例工厂实例化
public class userDaoFactory {
public userDaoFactory(){
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
id:为自己起的名称
class:为类的全路径
init-method:对象创建时调用的初始化方法
destory-method:对象销毁时调用的销毁方法
scope:bean的作用范围,默认为singleton
-->
<bean id="userDaoBean" class="com.ph.demo1.userDaoFactory"/>
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl"
init-method="initMethod" destroy-method="destoryMethod"
scope="prototype" factory-bean="userDaoBean"/>
</beans>
从以上结果可以得知,创建对象时首先会调用factory-bean里bean的无参构造方法,然后才会调用自己的无参构造方法,最后才会调用init-method里的方法