实例化bean的方法简述:
构造方法:无参、有参
静态工厂:无参、有参(静态方法)
实例工厂:无参、有参(非静态方法)
具体实现
1.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">
<!--
说明:这里只要是配置了bean,不论程序是不是用该bean,spring的ioc容器都会先创建该实例。
当然,也有办法配置如果不适用就不创建实例
-->
<!--通过无参构造方法实例化bean-->
<bean id="springBean" class="ioc09.SpringBean">
<!--property表示实例化了之后进行装配-->
<property name="username" value="tom"/>
<property name="age" value="14"/>
<property name="password" value="123"/>
</bean>
</beans>
package ioc09;
public class SpringBean {
private String username;
private String password;
private Integer age;
//spring先通过构造方法创建bean
public SpringBean() {
System.out.println("SpringBean.SpringBean");
}
@Override
public String toString() {
return "SpringBean{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
1.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">
<!--
说明:这里只要是配置了bean,不论程序是不是用该bean,spring的ioc容器都会先创建该实例。
当然,也有办法配置如果不适用就不创建实例
-->
<bean id="springBean2" class="ioc09.SpringBean">
<!--用带参的构造方法实例化bean-->
<!--表示实例化时给构造方法传递参数-->
<!--name字段表示的是构造方法的参数名称-->
<constructor-arg name="name" value="alice"/>
<constructor-arg name="age" value="14"/>
<constructor-arg name="pwd" value="123"/>
</bean>
</beans>
package ioc09;
public class SpringBean {
private String username;
private String password;
private Integer age;
public SpringBean(String name, String pwd, Integer age) {
System.out.println("SpringBean(String,String,String)");
this.username = name;
this.password = pwd;
this.age = age;
}
@Override
public String toString() {
return "SpringBean{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.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">
<!--通过无参的静态工厂实例化bean-->
<!--
calss属性的值是静态工厂的名称
factory-method是告诉spring调用静态工厂中的那个方法
-->
<bean id="springBean" class="ioc10.SpringBeanFactory" factory-method="getSpringBean">
<!--通过构造方法进行装配-->
<property name="username" value="tomcat"/>
</bean>
</beans>
package ioc10;
public class SpringBean {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "SpringBean{" +
"username='" + username + '\'' +
'}';
}
}
package ioc10;
public class SpringBeanFactory {
public static SpringBean getSpringBean(){
return new SpringBean();
}
}
package ioc10;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String [] args){
//不使用spring时的方式,
/*SpringBean springBean = SpringBeanFactory.getSpringBean();
springBean.setUsername("tom");*/
//使用spring
ApplicationContext ac = new ClassPathXmlApplicationContext("ioc10/spring.xml");
SpringBean springBean1 = (SpringBean) ac.getBean("springBean");
System.out.println(springBean1);
}
}
2.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">
<!--通过带参的静态工厂实例化bean-->
<bean id="springBean2" class="ioc10.SpringBeanFactory" factory-method="getSpringBean">
<!--name属性代表静态工厂SpringBeanFactory的getSpringBean方法的入参-->
<constructor-arg name="name" value="tony"/>
</bean>
</beans>
package ioc10;
public class SpringBean {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "SpringBean{" +
"username='" + username + '\'' +
'}';
}
}
package ioc10;
public class SpringBeanFactory {
//有参的静态工厂
public static SpringBean getSpringBean(String name){
SpringBean springBean = new SpringBean();
springBean.setUsername(name);
return springBean;
}
}
package ioc10;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String [] args){
//不使用spring时的方式,
/*SpringBean springBean = SpringBeanFactory.getSpringBean();
springBean.setUsername("tom");*/
//使用spring
ApplicationContext ac = new ClassPathXmlApplicationContext("ioc10/spring.xml");
SpringBean springBean2 = (SpringBean) ac.getBean("springBean2");
System.out.println(springBean2);
}
}
3.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">
<!--实例工厂-->
<bean id="springBeanFactory" class="ioc12.SpringBeanFactory"/>
<!--无参-->
<!--
如果没有SpringBeanFactory的实例,那么factory-method的
方法调用会报错,应该先让spring实例化一个SpringBeanFactory
-->
<!--
class="ioc12.SpringBeanFactory" 要替换,因为这里不是调用类的静态方法,
并不是直接访问了如果没有SpringBeanFactory的实例这个类
-->
<!--factory-bean属性表示工厂实例-->
<bean id="springBean" factory-bean="springBeanFactory" factory-method="getSpringBean">
<property name="username" value="luccy"/>
</bean>
</beans>
package ioc12;
public class SpringBean {
private String username;
@Override
public String toString() {
return "SpringBean{" +
"username='" + username + '\'' +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
package ioc12;
public class SpringBeanFactory {
public SpringBean getSpringBean(){
System.out.println("SpringBeanFactory getSpringBean");
return new SpringBean();
}
public SpringBean getSpringBean(String name){
System.out.println("SpringBeanFactory getSpringBean");
SpringBean springBean = new SpringBean();
springBean.setUsername(name);
return springBean;
}
}
package ioc12;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String [] args){
//手工java代码实现SpringBean
/*SpringBeanFactory factory = new SpringBeanFactory();
SpringBean springBean = factory.getSpringBean();*/
//通过IOC容器管理SpringBean
ApplicationContext ac = new ClassPathXmlApplicationContext("ioc12/spring.xml");
System.out.println(ac.getBean("springBean"));
}
}
3.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">
<!--实例工厂-->
<bean id="springBeanFactory" class="ioc12.SpringBeanFactory"/>
<!--带参数-->
<bean id="springBean2" factory-bean="springBeanFactory" factory-method="getSpringBean">
<constructor-arg name="name" value="lisi"/>
</bean>
</beans>
package ioc12;
public class SpringBean {
private String username;
@Override
public String toString() {
return "SpringBean{" +
"username='" + username + '\'' +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
package ioc12;
public class SpringBeanFactory {
public SpringBean getSpringBean(){
System.out.println("SpringBeanFactory getSpringBean");
return new SpringBean();
}
public SpringBean getSpringBean(String name){
System.out.println("SpringBeanFactory getSpringBean");
SpringBean springBean = new SpringBean();
springBean.setUsername(name);
return springBean;
}
}
实例化bean的时机
1、ApplicationContext方式获取IOC容器
<?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">
<!--
默认预先实例化,即在IOC容器启动时实例化。通过lazy-init属性可以修改实例化时机,设置为懒实例化。
懒实例化,即在第一次使用bean时实例化。
实际应用中都是使用预先实例化,虽然服务器启动慢,但是用户访问速度快。
-->
<bean id="springBean" class="ioc14.SpringBean" lazy-init="false">
<property name="username" value="kity"/>
</bean>
</beans>
2、BeanFactory方式获取IOC容器
只能懒实例化,无法预先实例化,使用bean时才会实例化。