IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring的ioc的扫描器与bean的作用域与生命周期 -> 正文阅读

[Java知识库]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对象未在指定包范围,即使声明了注解,也无法实例化)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">


        <!--
            使用注解方式进行创建对象
            1.开启注解扫描
            含义:开启注解扫描,指定了 base-package 扫描指定的包,扫描包与子包中所有的类
            查看类上是否有指定的注解, 如果类上有指定的注解,那么就创建给类对象,
            放到spring容器中
        -->
        <context:component-scan base-package="com.package"/>

        
</beans>


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

Dao层:

package com.lsf.dao;

import org.springframework.stereotype.Repository;

//Dao层使用扫描器
@Repository
public class AccountDao {

    public void test(){
        System.out.println("AccountDao....");
    }
}


service层:

package com.lsf.service;

import com.lsf.conteoller.AccountController;
import com.lsf.dao.AccountDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

//Service层使用扫描器
@Service
public class AccountService {
    //bean自动注入
    @Autowired
    private AccountDao accountDao;

    public void test(){
        System.out.println("AccountService....");
        accountDao.test();
    }

}

controller层:

package com.lsf.conteoller;

import com.lsf.service.AccountService;
import com.lsf.util.PropertyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

//Controller层扫描器
@Controller
public class AccountController {
    //bean自动注入方式一   Resource
    @Resource
    private AccountService accountService;
    //bean自动注入方式二   Autowired
    @Autowired
    private PropertyUtil propertyUtil;

    public void test(){
        System.out.println("AccountController....");
        propertyUtil.test();
        accountService.test();
    }
}


econtroller任意类(工具类):

package com.lsf.util;


import org.springframework.stereotype.Component;

//工具类使用扫描器
@Component
public class PropertyUtil {
    public void test(){
        System.out.println("PropertyUtil....");
    }
}



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

现象证明:

package com.lsf;

import com.lsf.conteoller.AccountController;
import com.lsf.service.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Starter {

    public static void main(String[] args) {
        BeanFactory factory = new ClassPathXmlApplicationContext("spring.xml");
        
        //bean对象的id属性默认是类的首字母小写
        AccountController accountController = (AccountController) factory.getBean("accountController");
        accountController.test();
    }
}

?


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

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

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

  <context:component-scan base-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 属性来完成。):

package com.lsf.service;


public class AccountService {
   
    public void test(){
        System.out.println("AccountService....");
        accountDao.test();
    }

}

xml配置

 <bean id="accountService" class="com.lsf.service.AccountService" init-method="test"></bean>

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

public class RoleService implements InitializingBean {
    @override
    public void afterPropertiesSet() throws Exception {
        System. out.println( "RoleService init. .."):
    }
}



//xml配置

<bean id="roleService" class="com . xxxx,service.RoleService" ></bean>

bean的使用

方式一(使用BeanFactory):

package com.lsf;

import com.lsf.conteoller.AccountController;
import com.lsf.service.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Starter {

    public static void main(String[] args) {
        //bean的使用
        BeanFactory factory = new ClassPathXmlApplicationContext("spring.xml");

        AccountController accountController = (AccountController) factory.getBean("accountController");
        
    }
}

方式二(使用ApplicationContext):

package com.lsf;

import com.lsf.conteoller.AccountController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Starter {

    public static void main(String[] args) {
        
        //bean的使用
        ApplicationContext factory = new ClassPathXmlApplicationContext("spring.xml");

        AccountController accountController = (AccountController) factory.getBean("accountController");
        accountController.test();
    }
}

bean的销毁


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


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

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

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

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 01:51:23  更:2022-09-15 01:52:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:23:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码