spring Bean个人复习

接口

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

 

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

 

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

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

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

下面有一个例子

 

房屋中介                                    IOC

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

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

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

 

 

Bean初始化

spring 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

、。。。在图片内

spring Bean个人复习

 

 

 

 

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

[email protected](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是一样的)