Spring对bean的管理细节

  • 创建bean的三种方式:默认构造函数、使用工厂中的普通方法、使用工厂中的静态方法
  • 创建bean的作用:获取spring容器

1. 使用默认构造函数创建

如何通过创建javabean类来解析json数据 javabean类怎么创建_默认构造函数

在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();
    }
}