Spring对bean的管理细节
- 创建bean的三种方式:默认构造函数、使用工厂中的普通方法、使用工厂中的静态方法
- 创建bean的作用:获取spring容器
1. 使用默认构造函数创建
在Spring的配置文件中使用bean标签,配置id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象,此时如果类中没有【默认构造函数】,则对象无法创建。
- id:唯一标识 【一个对象的引用】
- chass:获取创建对象的全限定类名
代码:
创建的是
AccountServiceImpl
对象,用accountService
这个id来取。
<?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">
<!--把对象的创建交给spring管理-->
<<bean id="accountService" class="cn.luis.service.impl.AccountServiceImpl"></bean>
</beans>
AccountServiceImpl
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao = new AccountDaoImpl();
/**
* No default constructor found 【报错】
*/
/*public AccountServiceImpl(String name) {
System.out.println("读取到配置文件,立即创建对象...");
}*/
// 一定要有默认构造函数
public AccountServiceImpl() {
}
@Override
public void saveAccount(){
System.out.println("servlce中的saveAccount方法执行了...");
}
}
Client (模拟Servlet)
下面两种方式也要用到此类!
public class Client {
public static void main(String[] args) {
// 1.获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
// 2.根据id获取Bean对象
IAccountService as = (IAccountService) ac.getBean("accountService");
System.out.println(as);
}
}
结果:
下面两种方式与之结果类似。
对象创建了...
cn.luis.service.impl.AccountServiceImpl@3098cf3b
2. 使用工厂中的普通方法创建对象
使用类中的某个方法创建对象,并存入spring容器中
id="accountService" 【实现类对象】
factory-bean="instanceFactory" 【指定工厂bean对象】
factory-method="getAccountService" 【指定哪个方法获取对象】
意思就是:使用instanceFactory
对象调用getAccountService
方法获取实现类对象AccountServiceImpl
代码:
<?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">
<!--把对象的创建交给spring管理-->
<bean id="instanceFactory" class="cn.luis.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory"
factory-method="getAccountService"></bean>
</beans>
模拟工厂
1 模拟一个工厂,该类可能是存在于【jar包】中的,我们无法通过修改源码的方式来提供默认构造函数
【jar包】里面都是 .class 文件,无法修改
2.若要将某个【方法】的返回值存入spring容器中
就用到了创建Bean的第二种方式
代码:
package cn.luis.factory;
import cn.luis.service.IAccountService;
import cn.luis.service.impl.AccountServiceImpl;
public class InstanceFactory {
public IAccountService getAccountService() {
return new AccountServiceImpl();
}
}
3.使用工厂中的静态方法创建对象
使用类中的静态方法创建对象,并存入spring容器中
factory-method="getAccountService"
代码:
<?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">
<!--把对象的创建交给spring管理-->
<bean id="accountService" class="cn.luis.factory.StaticeFactory"
factory-method="getAccountService"></bean>
</beans>
模拟工厂
1.模拟一个工厂,该类可能是存在于【jar包】中的,我们无法通过修改源码的方式来提供默认构造函数
【jar包】里面都是 .class 文件,无法修改
2.若要将某个【静态方法】的返回值存入spring容器中
就用到了创建Bean的第三种方式
package cn.luis.factory;
import cn.luis.service.IAccountService;
import cn.luis.service.impl.AccountServiceImpl;
public class StaticeFactory {
public static IAccountService getAccountService() {
return new AccountServiceImpl();
}
}