spring Bean个人复习
接口
用户沟通的中介物的抽象化
实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,声明了那些方法是对外公开提供的
在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
[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是一样的)