• Spring的ioc的扫描器与bean的作用域与生命周期


    目录

    IOC扫描器

    扫描器的配置

    1、设置自动化扫描的范围(如果bean对象未在指定包范围,即使声明了注解,也无法实例化)

    2、使用指定的注解(声明在类级别,bean对象的id属性默认是类的首字母小写)

    Dao层:

    service层:

    controller层:

    econtroller任意类(工具类):

    ​编辑

    扫描器作用:bean对象统一进行管理,简化开发配置,提高开发效率

    遇到错误:Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 

    bean的作用域

    lazy-init属性

    lazy-init属性好处:

    什么对象适合作为单例对象(什么对象适合IOC维护?)

    什么是无状态或状态不可改变的对象?

    单例作用域与原型作用域

    scope属性:

    bean生命周期

    bean的定义

    bean的初始化

    方式一(在配置文档中通过指定init-method 属性来完成。):

    方式二(实现org.springframework.beans.factory.InitializingBean接口):

    bean的使用

    方式一(使用BeanFactory):

    方式二(使用ApplicationContext):

    bean的销毁

    步骤一(实现销毁方式(Spring容器会维护bean对象的管理,可以指定bean对象的销毁所要执行的方法)):

    步骤二(通过AbstractApplicationContext对象,调用其close方法实现bean的销毁过程):


    IOC扫描器

    在实际的开发中,bean的数量非常多,采用手动配置bean的方式已无法满足生产需要,Spring这时候同样提供了扫描的方式,对扫描到的bean对象统一进行管理,简化开发配置,提高开发效率。
     

    扫描器的配置

    1、设置自动化扫描的范围(如果bean对象未在指定包范围,即使声明了注解,也无法实例化)

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/context
    8. http://www.springframework.org/schema/context/spring-context.xsd">
    9. package="com.package"/>


    2、使用指定的注解(声明在类级别,bean对象的id属性默认是类的首字母小写)
     

    Dao层:

    1. package com.lsf.dao;
    2. import org.springframework.stereotype.Repository;
    3. //Dao层使用扫描器
    4. @Repository
    5. public class AccountDao {
    6. public void test(){
    7. System.out.println("AccountDao....");
    8. }
    9. }


    service层:

    1. package com.lsf.service;
    2. import com.lsf.conteoller.AccountController;
    3. import com.lsf.dao.AccountDao;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Service;
    6. //Service层使用扫描器
    7. @Service
    8. public class AccountService {
    9. //bean自动注入
    10. @Autowired
    11. private AccountDao accountDao;
    12. public void test(){
    13. System.out.println("AccountService....");
    14. accountDao.test();
    15. }
    16. }

    controller层:

    1. package com.lsf.conteoller;
    2. import com.lsf.service.AccountService;
    3. import com.lsf.util.PropertyUtil;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Controller;
    6. import javax.annotation.Resource;
    7. //Controller层扫描器
    8. @Controller
    9. public class AccountController {
    10. //bean自动注入方式一 Resource
    11. @Resource
    12. private AccountService accountService;
    13. //bean自动注入方式二 Autowired
    14. @Autowired
    15. private PropertyUtil propertyUtil;
    16. public void test(){
    17. System.out.println("AccountController....");
    18. propertyUtil.test();
    19. accountService.test();
    20. }
    21. }


    econtroller任意类(工具类):

    1. package com.lsf.util;
    2. import org.springframework.stereotype.Component;
    3. //工具类使用扫描器
    4. @Component
    5. public class PropertyUtil {
    6. public void test(){
    7. System.out.println("PropertyUtil....");
    8. }
    9. }



    注:开发过程中建议按照指定规则声明注解

    现象证明:

    1. package com.lsf;
    2. import com.lsf.conteoller.AccountController;
    3. import com.lsf.service.UserService;
    4. import org.springframework.beans.factory.BeanFactory;
    5. import org.springframework.context.support.ClassPathXmlApplicationContext;
    6. public class Starter {
    7. public static void main(String[] args) {
    8. BeanFactory factory = new ClassPathXmlApplicationContext("spring.xml");
    9. //bean对象的id属性默认是类的首字母小写
    10. AccountController accountController = (AccountController) factory.getBean("accountController");
    11. accountController.test();
    12. }
    13. }

     


    扫描器作用:bean对象统一进行管理,简化开发配置,提高开发效率

    遇到错误:Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 
     

    解答:设置自动化扫描的范围小了,导致不能生成需要的bean对象,所有报错,扩大扫描包的范围

      package="扩大包范围位置"/>

     

    bean的作用域

    默认情况下,我们从spring容器中拿到的对象均是单例的,对于bean的作用域类型如下:
     

    默认情况下,被管理的bean只会loC容器中存在一个实例,对于所有获取该Bean的操作Spring容器将只返回同一个Bean。


    容器在启动的情况下就实例化所有singleton的bean对象,并缓存与容器中

    lazy-init属性

             lazy-init是懒加载,如果等于true时作用是指spring容器启动的时候不会去实例化这个bean,而是在程序调用时才去实例化.默认是false即spring容器启动时实例化.

            如果为false,则在IOC容器启动时会实例化bean对象,默认false
            如果为true,则oc容器启动时不会实例化Bean对象,在使用bean对象时才会实例化


    lazy-init属性好处:

    1. 可以提前发现潜在的配置问题
    2. Bean对象存在于缓存中,使用时不用再去实例化bean,加快程序运行效率

    什么对象适合作为单例对象(什么对象适合IOC维护?)

    一般来说对于无状态或状态不可改变的对象适合使用单例模式。(不存在会改变对象状态的成员变量)比如: controller层、 service层、dao层。

    什么是无状态或状态不可改变的对象?


    实际上对象状态的变化往往均是由于属性值的变化而引起的,比如user类姓名属性会有变化,属性姓名的变化一般会引起user对象状态的变化。对于我们的程序来说,无状态对象没有实例变量的存在,保证了线程的安全性,service层业务对象即是无状态对象。线程安全的。

     

    单例作用域与原型作用域


    scope属性:

    singleton 该bean为单例,作用在单例缓存池中(默认情况

    prototype 该bean为原型,Spring容器在启动时会实例化Bean对象,不会将对象设置到单例缓存池中,每次请求都会重新创建一个新的Bean


     

     

    bean生命周期

    在spring中,Bean的生命周期包括Bean的定义、初始化、使用和销毁4个阶段

    bean的定义

    在Spring中,通常是通过配置文档的方式来定义Bean的。在一个配置文档中,可以定义多个Bean。(在配置文件中定义bean标签,设置对应的id与class属性值

    bean的初始化

    默认在IOC容器加载时,实例化对象。Spring bean初始化有两种方式:


    方式一(在配置文档中通过指定init-method 属性来完成。):

    1. package com.lsf.service;
    2. public class AccountService {
    3. public void test(){
    4. System.out.println("AccountService....");
    5. accountDao.test();
    6. }
    7. }

    xml配置

     "accountService" class="com.lsf.service.AccountService" init-method="test">
    

    方式二(实现org.springframework.beans.factory.InitializingBean接口):

    1. public class RoleService implements InitializingBean {
    2. @override
    3. public void afterPropertiesSet() throws Exception {
    4. System. out.println( "RoleService init. .."):
    5. }
    6. }
    7. //xml配置
    8. "roleService" class="com . xxxx,service.RoleService" >

    bean的使用

    方式一(使用BeanFactory):

    1. package com.lsf;
    2. import com.lsf.conteoller.AccountController;
    3. import com.lsf.service.UserService;
    4. import org.springframework.beans.factory.BeanFactory;
    5. import org.springframework.context.support.ClassPathXmlApplicationContext;
    6. public class Starter {
    7. public static void main(String[] args) {
    8. //bean的使用
    9. BeanFactory factory = new ClassPathXmlApplicationContext("spring.xml");
    10. AccountController accountController = (AccountController) factory.getBean("accountController");
    11. }
    12. }

    方式二(使用ApplicationContext):

    1. package com.lsf;
    2. import com.lsf.conteoller.AccountController;
    3. import org.springframework.context.ApplicationContext;
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;
    5. public class Starter {
    6. public static void main(String[] args) {
    7. //bean的使用
    8. ApplicationContext factory = new ClassPathXmlApplicationContext("spring.xml");
    9. AccountController accountController = (AccountController) factory.getBean("accountController");
    10. accountController.test();
    11. }
    12. }

    bean的销毁


    实现销毁方式(Spring容器会维护bean对象的管理,可以指定bean对象的销毁所要执行的方法)。


    步骤一(实现销毁方式(Spring容器会维护bean对象的管理,可以指定bean对象的销毁所要执行的方法)):

      "accountService" class="com.lsf.service.AccountService" destroy-method="自己写销毁方法">
    

    步骤二(通过AbstractApplicationContext对象,调用其close方法实现bean的销毁过程):

    1. AbstractApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    2. ac.close();

  • 相关阅读:
    javaWep内置对象的使用
    高级架构师_Docker_第1章_第3节Docker容器
    c++ - 第13节 - c++中的继承
    【个人亲历】上海市人才引进落户最详细的流程记录说明
    提高C++性能的编程技巧
    如何判断人脸门禁一体机/人脸识别终端是否支持4G、WIFI、刷IC卡、刷身份证
    1136 A Delayed Palindrome
    小白零基础自学Java,究竟如何才能学的透彻!
    Java 中的 ==, equals 与 hashCode 的区别与联系
    【RocketMQ 二十七】RocketMQ 消费幂等
  • 原文地址:https://blog.csdn.net/weixin_47514459/article/details/126838694