前言:
Spring框架因其灵活性和强大功能而广受欢迎,特别是在企业级应用程序的开发中。其核心概念“控制反转”(IoC)和“面向切面编程”(AOP)使得对象管理变得更加高效。
在Spring中,Bean是被Spring容器管理的对象,其定义和管理方式主要有XML配置和注解两种。近年来,基于注解的方式因其简洁性和可读性渐受青睐。
本文将探讨Spring框架中的Bean管理,重点比较XML标签与注解方式的优缺点,帮助开发者更好地理解和应用Spring,以提升开发效率与代码质量。
Spring简单理解
Spring是什么呢?
Spring是一个轻量级的,IOC和AOP的一站式Java开发框架,简化企业级开发
- 轻量级:框架体积小(核心模块)
- IOC:Inversion of Control(控制反转),把创建对象的控制权反转给spring框架
- AOP:Aspect Oriented Programming(面向切面编程)
- 一站式:除了核心的IOC和AOP功能之外,还对数据访问层,Web层都有封装,所以是一站式
面向切面变成
将程序中的一些公共的非业务代码分离提取出来,然后在业务代码执行时,给他们横切进来.使用的动态代理的机制实现,在我们的业务代码,不显示的调用,但是执行业务代码,会通过代理对象,调用非业务代码
Spring框架搭建(Hello World搭建)
第一步:Maven导入Spring核心jar包
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
第二步:编写spring配置文件
<?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="admin" class="com.kid.springpro.model.Admin"></bean>
</beans>
第三步:编写一个Admin实体类
package com.kid.springpro.model;
import org.springframework.stereotype.Component;
public class Admin {
private String account;
private String password;
public Admin() {
System.out.println("admin无参构造方法");
}
public Admin(String account, String password) {
this.account = account;
this.password = password;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第四步:测试spring
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Admin admin = (Admin) applicationContext.getBean("admin");
Admin admin1 = applicationContext.getBean("admin", Admin.class);
System.out.println(admin);
System.out.println(admin1);
结果:
代码解释:
<bean id="admin" class="com.kid.springpro.model.Admin"></bean> ---->bean标签(下文解释)
上图结果所示:二个对象打印出的结果相同,这是因为spring只生成一个对象,所以打印出来相同,但是这个属性可以在bean标签中设置 (scope="singleton" )
Bean标签
bean标签是往spring管理中添加数据,也就是我们通过bean标签从而让spring管理类
Bean标签属性
- id="对象名称",可以在getBean中获得spring生成的对象
- class="需要Spring管理的类的地址"
- scope="配置bean的作用域"
- scope="singleton" 单例的(默认值) 在Spring框架启动时,就创建对象,而且始终只创建一个对象
- scope="prototype" 原型的(多例的) 在每次获得对象时,创建一个新的对象
当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
- 对象创建:当应用加载,创建容器时,对象就被创建了
- 对象运行:只要容器在,对象一直活着
- 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
Bean生命周期
- 对象创建:当使用对象时,创建新的对象实例
- 对象运行:只要对象在使用中,就一直活着
- 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
Bean生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
Bean注入依赖
set注入(类中必须有set方法)
<!--1.通过属性,属性的set方法-->
<bean id="admin" class="com.kid.springpro.model.Admin" scope="prototype">
<property name="account" value="admin"></property>
<property name="password" value="111"></property>
</bean>
构造方法注入(必须有 有参构造)
<!--通过构造方法赋值-->
<bean id="admin" class="com.kid.springpro.model.Admin" scope="prototype">
<constructor-arg name="account" value="admin"></constructor-arg>
<constructor-arg name="password" value="111"></constructor-arg>
</bean>
IOC(控制反转)
控制反转不是一种技术,而是一种思想,就是将原本在程序中手动创建对象的控制权,交给Spring框架来管理.
IOC容器负责对象的实例化,对象的初始化,对象和对象的依赖关系,对象的销毁,对外界提供对象的查询等操作,对象的整个生命周期都是由容器来控制.
正控:若要使用某个对象,需要自己去负责对象的创建
反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象, 不关心对象的创建过程,也就是把创建对象的控制权反转给了 Spring 框架
通过<bean>标签将对象添加到IOC容器中
ClassPathXmlApplicationContext方法
读取Spring.xml文件(加载数据)
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
ClassPathXmlApplicationContext() 是Spring框架中的一个具体实现类,生成配置管理程序中对象
可以看做一个容器,所以一般把spring框架也称为Spring容器或者IOC容器
new ClassPathXmlApplicationContext("spring.xml");
getBean()方法使用
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Admin admin = (Admin) applicationContext.getBean("admin");
Admin admin1 = applicationContext.getBean("admin", Admin.class);
getBean("id") id---->也就是bean标签中的id
Spring注解开发
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效
@Component 使用在类上用于实例化Bean
@Repository 使用在dao层类上用于实例化Bean
@Autowired 自动注入。用于在属性和属性的set方法上,如果写在属性上, set方法都可以不需要。默认情况下,要注入的值不能为空(required = true)
@Resource 是Java语言中提供的注解标签 不允许注入的值为空,添加在属性上,也不需要写set方法
@Scope 标注Bean的作用范围
Scope设置:
@Scope( value = "prototype") 原型
@Scope( value = "singleton") 单例
注解与 XML 的对比
注解优点: 方便,直观,高效(代码少,没有配置文件的书写那么复杂)。
注解缺点:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重 启服务器即可将新的配置加载。
xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。
感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!
希望路飞的笑容可以治愈努力路途中的你我!
博主vx:Dreamkid05 --->欢迎大家和博主讨论问题