spring Bean个人复习

本文深入探讨了Spring框架的关键概念,包括接口、控制反转(IOC)、依赖注入(DI)、Bean的初始化与生命周期、自动装配(Autowiring)、以及Spring容器注解的使用,如@Bean、@Configuration和@Component。此外,还介绍了资源文件的加载方法和@Bean的单例特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口

用户沟通的中介物的抽象化
实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,声明了那些方法是对外公开提供的
在java8,接口可以拥有方法体

 

IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建于维护,而是交给外部容器负责与维护(如何创建与维护?抵触如何实现)
DI:依赖注入

 

控制反转 就是找到你想找到的目标 比如 你想找到一个名字叫小新的人,你确定 如果你找的不是这个人 那么就报错

就行不断找对象,找到后,然后使用它,不需要了解内部

所有对象都被sping控制,所以这叫控制反转

下面有一个例子

 

房屋中介                                    IOC

找中介        -------------------->  找IOC容器

找中介介绍房子 -------------->  容器返回对象

租房,入住        -------------->  使用对象

 

 

Bean初始化

 

在IOC容器中将所有的控制对象称作bean,Spring对于bean的使用有两种方式:

基于spring-ioc.xml的配置和注解。 注意xml中关于bean的配置程序段

<bean id="oneInterface(自定义)" class="配置的实现类"></bean>

使用示例:
这里不需要new

public void test(){

    OneInterface interface=super.getBean("oneInterface");//获取bean,不需要new对象

    interface.hello();//调用函数
}

 

Spring 注入:是指在启动 Spring 窗口加载 bean 配置时完成对变量的赋值行为

常用两种注入方式

A、设值注入 <property name="xxx" ref="xxx"></property>

B、构造注入 <constructor-arg name="xxx" ref="xxx"></constructor-arg>

 

property 属性 在bean里面有一个name为"injectionDAO"的属性 属性类型是ref引入的injectionDaod的类型
ref引入的id

 

bean的生命周期:

1、初始化

(1)配置init-method

<bean id ="" class ="" init-method="">

 

(2)实现org.springframework.beans.factory.InitializingBean接口,覆盖其中的afterPropertiesSet方法

2、销毁

(1)配置destory-method

<bean id ="" class ="" destory-method="">

(2)实现·org.springframework.beans.factory.DisposableBean接口中的destory()方法

3,配置全局初始化和销毁

<beans default-init-method=" " default-destroy-method=" ">

4、三种不同配置方式的优先级问题

(1)运行的优先顺序:

InitializingBean接口 > init-method > DisposableBean接口 > destroy-method

(2)局部配置 会覆盖 全局配置

(3)全局配置中的方法为可选项,若其他两种方法已有配置,可以没有全局方法. 若没有其他两种方法(可选方法),全局配置即使配置上了,类里没有相应方法也不会报错.

 

 

Aware接口

 

1.ApplicationContextAware

1.1 接口方法:setApplicationContext

 

1.2 作用:通常用来获取上下文对象,声明全局变量后在方法中对变量进行初始化并供其他方法调用

1.3 实现过程:

创建一个类并实现ApplicationContextAware接口,重写接口方法public void setApplicationContext(ApplicationContext applicationContext);

在xml文件中配置该类;当spring加载该配置文件时即调用接口方法

2.BeanNameAware

2.1 接口方法:setBeanName

2.2 作用:获取声明的类名,声明全局变量后在方法中对变量进行初始化并供其他方法调用

2.3 实现过程:创建一个类并实现BeanNameAware接口,重写接口方法public void setBeanName(String name);

在xml文件中配置该类;当spring加载该配置文件时即调用接口方法 综合测试:

1.创建一个类,同时实现ApplicationContextAware和BeanNameAware接口并重写其方法。声明一个全局变量beanName并在方法setBeanName对其初始化;

2.在setApplicationContext方法中使用参数applicationContext的getBean方法(方法参数为成员变量beanName,即this.beanName)获取bean的名称并打印其hashcode

4.super.getBean("BinglianBeanName").hashCode();如果相同 那么就是同一个bean

 

 

Resources (针对于资源文件的统一接口)

1、UrlResource:URL 对应的资源,根据一个 URL 地址即可获取

2、ClassPathResource:获取类路径下的资源 C、FileSystemResource:获取文件系统里面的资源

3、ServletContextResource:ServletContext 封装的资源,用于访问 ServletContext 环境下的资源

4、InputStreamResource:获取输入流封装的资源 F、ByteArrayResource:获取字节数组封装的资源

 

通过实现 ApplicationContextAware 接口中的方法 setApplicationContext(ApplicationContext applicationContext) Resource resource = applicationContext.getResource("xxx");

 

在xxx中进行替换 它是资源路径

classpath:config.txt

file:C:\\config.txt

、。。。在图片内

 

 

 

 

Bean的自动装配(Autowiring)

1.No:不做任何操作

2.byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配

3.byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型的bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生

4.Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常

 

Bean的自动装配:

在beans标签配置属性 default-autowire="no/byName/byType/constructor"

作用为:省去了在Spring的xml中配置property标签和constructor-arg标签,只需要配置bean标签即可

PS:byName和byType为设值注入,constructor为构造注入;

byName要求bean标签的id属性需要和成员变量的名称一致, byType和constructor则跟id无关 

 

 

spring容器注解——Bean注解

 

1.
@Bean

public A stringStore(){return new A();}//该bean在注册到SpringIoc容器里的名称是stringStore.

2指定名称@Bean(name="xx")时,该bean在注册到SpringIoc容器里的名称是xx

3.@Bean(name="" initMethod="" destroyMethod=""),支持init和destroy,同xxx.xml配置文件效果相同。


Store store = super.getBean("stringStore")

使用方法名作为bean的id 获取方法名就行

 

@Bean 和@Configuration 注解一起使用

 

@Bean和@Component区别好像是:

@Bean注册了一个在方法上的Bean,而不同过此方法的调用都得不到这个Bean实例,除非在这个Bean对应的类上注解

@Component注解注册了一个在类上的bean,但是这个bean你只要写上BeanName就可以获得。

 

@component (把普通pojo实例化到spring容器中,相当于配置文件中的
<bean id="" class=""/>)

    泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

案例:
<context:component-scan base-package=”com.*”>
上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包。
共同点:被@controller 、@service、@repository 、@component 注解的类,都会把这些类纳入进spring容器中进行管理
 

 

@ImportResource 加载资源文件 根据@Value注释

@Value("${}")   {}里的变量对应.properties文件里的key

properties

文件是key-value键值对形式的文件,

加载资源文件: <context:property-placeholder location="classpath:/com/acme/jdbc.propertied"/>

加载这个文件后,可以再当前文件中采用${jdbc.url}这种形式来使用配置文件中的内容. 例如: <property name="url" value="${jdbc.url}"/>

 

如果使用注解则: 在类名前加上:

@Configuration

@ImportResource("classpath:/com/acme/propertied-config.xml")引入一个资源,对应一个xml文件中包含property_placeholder

 

 

默认 @Bean是单例的

@Scope(value="prototype")

为了指定范围,使用@Scope注解,singleton,prototype(每次请求都会创建一个新的对象,为了区分,应该查看对象的hashcode,而类的hashcode是一样的)


 

### 关于Spring框架期末考试复习资料 #### Spring核心概念理解 深入掌握Spring的核心特性对于应对期末考试至关重要。重点在于理解和应用IoC容器、AOP编程以及Bean管理机制等内容[^1]。 #### IoC/AOP原理剖析 - **控制反转(IoC)** 是指对象创建和依赖关系由外部容器负责,而非程序内部自行实例化。这有助于降低组件间的耦合度并提高灵活性。 - **面向切面(AOP)** 利用横切关注点分离业务逻辑与其他功能(如日志记录),通过代理模式增强目标对象行为而不修改其源码。 #### 动态代理实现细节 Java中的动态代理主要分为两种形式:基于接口的JDK Proxy 和 基于类字节码操作的 CGLIB 。前者适用于实现了特定接口的对象;后者则用于那些没有具体接口定义的情况,在不改变原有结构的基础上扩展新能力。 #### 循环依赖解决方案——三级缓存策略 当两个或多个bean之间形成相互引用时就会发生循环依赖问题。为了处理这种情况,Spring采用了一套复杂的三级缓存体系来确保即使存在这样的关联也能正常加载beans。具体来说就是利用singletonObjects, earlySingletonObjects 及 singletonFactories三个层次存储不同状态下的单例bean实例,从而有效解决了这一难题。 #### 后置处理器(Post Processor) 此类工具允许开发者自定义初始化过程前后的行为动作,比如注册额外的拦截器或是调整某些属性设置等。常见的有`BeanPostProcessor`,它可以在任何普通的bean被实际注入之前对其进行加工改造。 #### `@Transactional`注解解析及其工作流程 此注解用来声明式地开启事务边界,并自动管理和回滚异常情况下的数据库更改。其实现涉及到平台TransactionManager的选择、传播特性的设定等多个方面。了解这些可以帮助更好地设计可靠的数据访问层服务。 #### 事务传播级别的意义 不同的场景可能需要不一样的事务隔离级别以满足一致性需求。例如,默认情况下会继承上级已有的事务上下文继续执行;而在其他情形下或许更倾向于新开独立单元来进行保护性提交等等。 #### BeanFactory vs ApplicationContext对比分析 两者都是用来获取Spring容器内托管的各种资源和服务的关键入口之一。不过相较于前者较为基础的功能集而言,后者提供了更为丰富的API支持,包括但不限于事件发布订阅机制、国际化消息转换等功能模块。 ```java // 示例代码展示如何使用@Autowired进行依赖注入 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyService { private final AnotherService anotherService; @Autowired public MyService(AnotherService anotherService){ this.anotherService = anotherService; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值