spring中把所有对象都称之为bean
IOC及Bean容器一 接口
接口:只能有声明不能有实现,支持多重继承(在java8中接口可以拥有方法体)
抽象类:即可以有包含实现的声明也可以有不包含实现的声明
类:声明必须包含实现
接口实现的变动不会影响其他各层的调用,对公共服务非常重要
二 IOC——控制反转
控制反转:控制权的转移,应用程序本身不负责依赖对象的创建与维护,而是由外部容器负责创建和维护。
依赖注入(DI):是一种实现方式,由IOC容器在运行期间,动态的将某种依赖关系注入到对象之中
目的:创建对象并且组装对象之间的关系
三 BEAN容器的初始化
两个包:org.springframework.beans org.springframework.context
BeanFactory提供配置结构和基本功能,加载并初始化bean;
applicationContext保存了bean对象并在spring中广泛使用;
---本地文件
FileSystemXmlApplicationContext context=new FileSystemXmlApplicationContext("F:/PROJECTS/appcontext.xml“)
---ClassPath
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("classpath:spring-context.xml")
---web应用servlet或listener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
四.Spring的bean配置
在IOC容器中将所有的控制对象称作bean,Spring对于bean的使用有两种方式:基于spring-ioc.xml的配置和注解。
注意xml中关于bean的配置程序段
<bean id="oneInterface(自定义)" class="配置的实现类"></bean>
使用示例:
public void test(){
OneInterface interface=super.getBean("oneInterface");//获取bean,不需要new对象
interface.hello();//调用函数
}
Spring是指在启动Spring容器加载bean配置的时候,完成对成员变量的赋值行为
常用注入方式:设值注入,构造注入
注意:参数的名称必须保持一致!!!!
常用两种注入方式(dispatcher-servlet.xml//调度 DAO(Data Access Object) 数据访问对象 service业务逻辑层 )
A、设值注入
(1)<property name="xxx" ref="xxx"></property>
(2)public void setA(B b){
this.b=b;
}
B、构造注入
(1)<constructor-arg name="xxx" ref="xxx"></constructor-arg>
(2)public A(B b){
this.b=b;
}
-设值注入(不需要显示地调用set方法,会根据xml的相关配置自动进行调用。)
利用属性或成员变量的set方法进行注入
其中property里面的name是需要注入参数的成员变量的名称,ref是注入参数引入bean的名称
<xml>
<beans>
<bean id="接口service" class=“接口实现类serviceImpl”>
<property name ="成员变量" ref="下面的DAO 接口">
</bean>
<bean id="接口dao" class=“接口实现类daoImpl”>
<property name ="" ref="">
</bean>
</beans>
-构造注入
constructor-arg 标签为构造注入
其中的name的值是该类中的一个属性名称,ref的值是将要赋值给该属性的实例的id值(此处引用的是下面的bean,即下面的一个bean的id)
<?xml>
<beans>
<bean id="" >
<constructor-arg name="" ref="">
</bean>
<bean id="" >
</bean>
<beans>
1.bean的常用配置项:(理论上只有class是必须的)
id:唯一标识
class:具体是哪一个类
scope:范围
constructor arguments:构造器的参数
properties:属性
Autowiring mode:自动装配模式
lazy-initialization mode:懒加载模式
initialization/destruction method:初始化/销毁的方法
2.bean的作用域
singletion 单例 bean容器只有唯一的对象(默认模式)
prototype 每次请求会创建新的实例,destory方式不生效
request 对于request创建新的实例,只在当前request内有效
session 对于session创建新的实例,只在当前session内有效
global session 基于portlet(例如单点登录的范围)的web中有效,如果在web中同session
生命周期:定义,初始化,使用,销毁
一.初始化:
方法1.实现org.springframework.beans.foctory.InitializingBean接口,覆盖afterPropertiesSet方法。系统会自动查找afterPropertiesSet方法,执行其中的初始化操作
方法2.配置init-method
例如设置bean中init-method="init"那么在初始化过程中就会调用相应class指定类的init()方法进行初始化工作
二 销毁(与初始化类似)
方法1.实现org.springframework.beans.foctory.DisposableBean接口,覆盖destory方法。
方法2.配置destory-method
三 配置全局初始化、销毁方法(属于默认配置,参考截图)
注意:
当三种方式同时使用时,全局(默认的)初始化销毁方法会被覆盖。
另外实现接口的初始化/销毁方式会先于配置文件中的初始化/销毁方式执行。
即使没有以上三种初始化方法也是可以编译执行的
作用:实现了Aware接口的bean在初始化后可以获取相应资源并进行相应的操作(对于操作的结果要慎重!)
举例:
ApplicationContextAware:向实现了该接口的bean提供IOC容器的上下文信息(ApplicationContext),实现了该接口的bean必须配置到配置文件中并由spring的bean容器加载
BeanNameAware:向实现了该接口的bean提供关于beanName定义的相关内容
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无关
UrlResource:根据一个url地址即可构建
ClassPathResource:获取类路径下的资源文件
FileSystemResource:获取文件系统里面的资源
ServletContextResource:用于servletContextZ资源文件
InputStreamResource:针对输入流封装的资源
ByteArrayResource:针对字节数组封装的资源
ResourceLoader用来加载资源
public interface ResourceLoader{
Resource getResource(String Location);
}
Resource template=ctx.getResource("some/resource/path/myTemplate.txt");
Resource template=ctx.getResource("file:/some/resource/path/myTemplate.txt");
Resource template=ctx.getResource("classPath:some/resource/path/myTemplate.txt");
prefix:classPath: file:/ http: (none)/
spring--bean的定义及作用域的注解实现持久层:持久是相对于瞬时来说的,其实就是可以把数据固化在硬盘或者磁带一类可以保存很长时间的设备上,不像放在内存中一样断电就消失了。企业应用中数据很重要(各种订单数据、客户数据、库存数据之类的),比应用程序本身更重要,所以需要把数据持久化。持久化可以通过很多方式,写文件和数据库都可以。只是现在企业一般都会选择把数据持久化到数据库中,因为可以很方便的查询统计分析,但数据库的数据最终还是会写到磁盘上的。
1.Classpath扫描和组件管理
通过java的注解来定义bean
@configuration @Bean @Import @DependsOn
@Component是一个通用注解,可用于任何bean
-@Respority通常注解DAO类,既持久层
-@Service通常用于注解Service类,既服务层
-@Controller通常用于Controller类,既控制层(mvc)
2.元注解
四个元注解分别是:@Target,@Retention,@Documented,@Inherited ,是专门用来定义注解的注解,其作用分别如下:
@Target 表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括:
ElemenetType.CONSTRUCTOR----------------------------构造器声明
ElemenetType.FIELD --------------------------------------域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE------------------------- 局部变量声明
ElemenetType.METHOD ----------------------------------方法声明
ElemenetType.PACKAGE --------------------------------- 包声明
ElemenetType.PARAMETER ------------------------------参数声明
ElemenetType.TYPE--------------------------------------- 类,接口(包括注解类型)或enum声明
@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括:
RetentionPolicy.SOURCE ---------------------------------注解将被编译器丢弃
RetentionPolicy.CLASS -----------------------------------注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM-------将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
@Inherited 允许子类继承父类中的注解。
3.类的自动检测及bean注册
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd>
<context:component-scan base-package:"org.example"/>
<beans>
4.使用过滤器进行自定义扫描
默认情况下,类被自动发现并注册bean的条件是:使用@component @repository @service @controller或者使用@Component的自定义注解
可以通过过滤器修改上面的行为
所有的@resporitory用stub代替
<beans>
<context:component-scan base-package:"org.example">
<context:include-filter type="regex"--通配符
expression="."Stub."Respository"/>
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Respository"/>
</context:component-scan>
<beans>
还可以使用user-default-filter:false禁用自动发现和注册
5.定义bean
--@component @repository @service @controller都会有name属性用于显示bean name
--可自定义bean命名策略,实现BeanNameGenerator接口,并包含一个无参的构造器
<beans>
<context:component-scan base-package:"org.example">
name-generator="org.example.MynameGenerator">
<beans>
6.作用域(scope)
--@Scope(proportype)
@Resposiory
public class xx {
}
--也可以自定义
<beans>
<context:component-scan base-package:"org.example">
scope-resolver="org.example.Myscoperesolver">
<beans>
7.spring 代理方式scoped-proxy 三个值:no interface target-class
<beans>
<context:component-scan base-package:"org.example"
scoped-proxy="interface">
</beans>
共同学习,写下你的评论
评论加载中...
作者其他优质文章