前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring从入门到精通(七)—Bean标签详解

Spring从入门到精通(七)—Bean标签详解

作者头像
共饮一杯无
发布于 2022-11-28 08:20:54
发布于 2022-11-28 08:20:54
26600
代码可运行
举报
运行总次数:0
代码可运行

Bean标签基本配置

用于配置对象交由Spring 来创建。 默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

基本属性: id:Bean实例在Spring容器中的唯一标识 class:Bean的全限定名称

Bean标签范围配置

scope:指对象的作用范围,取值如下:

取值范围

说明

singleton

默认值,单例的

prototype

多例的

request

WEB   项目中,Spring   创建一个   Bean   的对象,将对象存入到   request   域中

session

WEB   项目中,Spring   创建一个   Bean   的对象,将对象存入到   session   域中

global   session

WEB   项目中,应用在   Portlet   环境,如果没有   Portlet   环境那么globalSession   相当于   session

1)当scope的取值为singleton时

Bean的实例化个数:1个

Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

Bean的生命周期:

对象创建:当应用加载,创建容器时,对象就被创建了

对象运行:只要容器在,对象一直活着

对象销毁:当应用卸载,销毁容器时,对象就被销毁了

2)当scope的取值为prototype时

Bean的实例化个数:多个

Bean的实例化时机:当调用getBean()方法时实例化Bean

对象创建:当使用对象时,创建新的对象实例

对象运行:只要对象在使用中,就一直活着

对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

Bean生命周期配置

init-method:指定类中的初始化方法名称

destroy-method:指定类中销毁方法名称

Bean的依赖注入入门

①创建 UserService,UserService 内部在调用 UserDao的save() 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserServiceImpl implements UserService {
	@Override
	public void save() {
         ApplicationContext applicationContext = new 
                 ClassPathXmlApplicationContext("applicationContext.xml");       	           UserDao userDao = (UserDao) applicationContext.getBean("userDao");	
          userDao.save();
 	}
 }

②将 UserServiceImpl 的创建权交给 Spring

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl"/>

③从 Spring 容器中获得 UserService 进行操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();

Bean的依赖注入概念

依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。

在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。

IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。

那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。

简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取

Bean的依赖注入方式

①构造方法

创建有参构造

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserServiceImpl implements UserService {
@Override
public void save() {
ApplicationContext applicationContext = new 
                 ClassPathXmlApplicationContext("applicationContext.xml"); 
    UserDao userDao = (UserDao) applicationContext.getBean("userDao");    
          userDao.save();
    }
 }

配置Spring容器调用有参构造时进行注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl">      		   	
    <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

②set方法

在UserServiceImpl中添加setUserDao方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
        } 
    @Override    
    public void save() {      
   		 userDao.save();
	}
}

配置Spring容器调用set方法进行注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl">
	<property name="userDao" ref="userDao"/>
</bean>

set方法:P命名空间注入

P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:

首先,需要引入P命名空间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xmlns:p="http://www.springframework.org/schema/p"

其次,需要修改注入方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl" p:userDao-
 ref="userDao"/>

Bean的依赖注入的数据类型

上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。

注入数据的三种数据类型

普通数据类型

引用数据类型

集合数据类型

其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型和集合数据类型的注入。

(1)普通数据类型的注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserDaoImpl implements UserDao {
    private String company;
    private int age;
    public void setCompany(String company) {
        this.company = company;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void save() {
        System.out.println(company+"==="+age);
        System.out.println("UserDao save method running....");   
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="company" value="huawei"></property>
    <property name="age" value="15"></property>
</bean>

(2)集合数据类型(List)的注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserDaoImpl implements UserDao {
	private List<String> strList;
	public void setStrList(List<String> strList) {
		this.strList = strList;
	}
	public void save() {
        System.out.println(strList);
        System.out.println("UserDao save method running....");
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="strList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </list>
    </property>
</bean>

(3)集合数据类型(List)的注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserDaoImpl implements UserDao {
	private List<User> userList;
	public void setUserList(List<User> userList) {
	this.userList = userList;  
 }
public void save() {
	System.out.println(userList);
	System.out.println("UserDao save method running....");
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="u1" class="com.zjq.domain.User"/>
<bean id="u2" class="com.zjq.domain.User"/>
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="userList">
        <list>
            <bean class="com.zjq.domain.User"/>
            <bean class="com.zjq.domain.User"/>
            <ref bean="u1"/>
            <ref bean="u2"/>       
        </list>
    </property>
</bean>

(4)集合数据类型( Map<String,User> )的注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserDaoImpl implements UserDao {
    private Map<String,User> userMap;
    public void setUserMap(Map<String, User> userMap) {
    this.userMap = userMap;
    }    
public void save() {      
	System.out.println(userMap);
	System.out.println("UserDao save method running....");
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="u1" class="com.zjq.domain.User"/>
<bean id="u2" class="com.zjq.domain.User"/>
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="userMap">
        <map>            
            <entry key="user1" value-ref="u1"/>
            <entry key="user2" value-ref="u2"/>
        </map>
    </property>
</bean>

(5)集合数据类型(Properties)的注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserDaoImpl implements UserDao {
    private Properties properties;
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
	public void save() {
		System.out.println(properties);
		System.out.println("UserDao save method running....");
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="properties">
        <props>
            <prop key="p1">aaa</prop>
            <prop key="p2">bbb</prop> 
            <prop key="p3">ccc</prop>
        </props>
    </property>
</bean>

引入其他配置文件(分模块开发)

实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<import resource="applicationContext-xxx.xml"/>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring 简介和配置
通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
繁依Fanyi
2023/05/07
1590
Spring 简介和配置
Spring依赖注入详解
P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:
兮动人
2021/10/15
2.6K0
Spring依赖注入详解
2-Spring配置文件与依赖注入
用于配置对象交由Spring来创建,默认情况下调用的是类中的无参构造函数,没有无参构造的情况下不能创建成功
Ywrby
2022/10/27
2570
Spring--框架学习
为了后期方便各州测试,在/src下新建test测试目录,在其中新建java文件夹,里面写测试代码
花猪
2022/02/22
1.3K0
Spring--框架学习
学习Spring框架这一篇就够了
Spring是分层的 Java SE/EE应用 full-stack(全栈的) 轻量级开源框架,以 IOC(Inverse Of Control:控制反转)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。
全栈程序员站长
2022/09/07
1.6K0
学习Spring框架这一篇就够了
怎样使用Spring的配置文件?带大家一起玩转Spring配置文件
创建一个maven工程,导入Spring需要的依赖,为了方便测试,我还导入了一个Junit测试包
我是一棵卷心菜
2022/01/18
1.4K0
Spring框架入门笔记
IoC(Inverse Of Control:反转控制)通过配置的方式,将对象的管理控制权交给spring容器,spring得到具体的包路径,类路径通过反射的方式,创建对象。
咕咕星
2020/12/15
3120
Spring框架入门笔记
Spring:IOC 控制反转
Spring 是分层的 Java SE/EE 应用 full-stack (全栈式) 轻量级开源框架。
RendaZhang
2020/09/16
9680
Spring:IOC 控制反转
Spring从入门到精通(八)—注解开发
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
共饮一杯无
2022/11/28
4450
Spring概述
2006年10月,发布 Spring2.0 2009年12月,发布 Spring3.0 2013年12月,发布 Spring4.0 2017年9月, 发布最新 Spring5.0 通用版(GA)
张哥编程
2024/12/13
1530
Spring之DI依赖注入
​ name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)
楠羽
2022/11/18
5140
Spring之DI依赖注入
Spring从入门到精通(五)—Spring快速入门
在类路径下(resources)创建applicationContext.xml配置文件
共饮一杯无
2022/11/28
2290
Spring注解开发
1. Spring原始注解 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。 Spring原始注解主要是替代<Bean>的配置 [在这里插入图片描述] 注意: 使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。 <!--注解的组件扫描--> <context:component-scan base
兮动人
2021/11/05
2070
Spring IOC基于XML管理Bean(二)
注意:在使用 <context:property-placeholder> 元素加载外包配置文件功能前,首先需要在 XML 配置的一级标签 <beans> 中添加 context 相关的约束。
鱼找水需要时间
2023/06/11
4920
Spring IOC基于XML管理Bean(二)
Spring(下)
Spring 提供了以下多个注解,这些注解可以直接标注在 Java 类上,将它们定义成 Spring Bean。
用户8126523
2023/04/25
4270
JAVAEE框架整合技术之Spring01-IOC教程
2006年10月,发布 Spring2.0 2009年12月,发布 Spring3.0 2013年12月,发布 Spring4.0 2017年9月, 发布最新 Spring5.0 通用版(GA)
张哥编程
2024/12/13
1400
JAVAEE框架整合技术之Spring01-IOC教程
4-注解开发与Junit集成
Spring是轻代码而重配置的框架,一般情况下,配置比较繁重,影响开发效率,所以注解开发是一种必然趋势,注解代替XML配置文件可以简化配置,提高开发效率
Ywrby
2022/10/27
2370
Spring: (一) -- 春雨润物之 核心IOC
作为一个Java人,想必都或多或少的了解过Spring。对于其优势也能道个一二,诸如方便解耦、支持AOP编程、支持声明式事务、方便测试等等。Spring也不仅仅局限于服务器端开发,它可以做非常多的事情,任何Java应用都可以在简单性、可测试性和松耦合等方面从Spring中受益。Spring丰富功能的底层都依赖于它的两个核心特性:
宋先生
2019/07/18
6530
【SSM_01】Spring-IOC
一、spring 概述 1. 什么是 spring * spring 是分层的 java ee 应用,全栈(full-stact)轻量级开源框架,主要有 IOC(反转控制) 、 AOP(面向切面编程) * 反转控制:将对象的创建全交给 spring,有利于解耦,降低代码的依赖关系 2. 使用方法 ① 导包 需要导入 4 个jar包 【spring-aop 、spring-beans 、spring-core 、spring-expression】 导入 spring-context 相当
用户8250147
2021/02/04
2180
java之spring之scope和autowiring
一. scope: 域 ; 在spring中由容器创建对象时可以以指定其scope,那么容器会根据不同的scope的值,创建指定域的对象。
Vincent-yuan
2019/09/11
3640
java之spring之scope和autowiring
相关推荐
Spring 简介和配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验