大纲
引入:面向接口编程
控制反转IoC
XML配置篇—Bean
注解篇—Bean
引入:面向接口编程
实体提供给外界的抽象化说明
各层之间依赖接口而非实现类
接口实现的变动不影响各层间的调用
接口用于隐藏具体实现和实现多态性的组件
控制反转IoC
1.控制反转:应用程序不负责对象的创建和维护,由外部容器创建和维护。
2.依赖注入(DI):创建对象并且组装对象之间的关系
获得依赖对象的过程被反转了,IoC容器在运行期间,动态的将某种依赖关系注入到对象之中。
容器中对象都称之为Bean
XML配置篇—Bean
初始化:
org.springframewrok.beans —提供BeanFactory提供配置结构和基本功能,加载并初始化Bean
org.springframewrok.context — ApplicationCotext保存了Bean对象并在Spring中广泛使用
ApplicationCotext加载方式:
本地文件(…xml)、Classpath、Web应用中依赖Servlet或Listener
FileSystemXmlApplicationContextcontext = new FileSystemXmlApplicationContext(“D:/aaa.xml”);
ClassPathXmlApplicationContextcontext = new ClassPathXmlApplicationContext(“classpath:spring-context.xml”);
org.springframework.web.context.ContextLoaderListener
context
org.springframework.web.context.ContextLoaderServlet
1
注入
启动Spring容器加载bean配置的时候完成对(成员)变量的赋值行为。
设值注入 — 类中要有相应的set方法,在配置文件的bean中添加属性
构造注入 — 类中要有相应的构造器,添加
Bean配置项(部分)
Id、Class、Scope、Constructor arguments、Properties、Autowiring mode(自动装配)、lazy-inirialization mode(懒加载)、Initialization\destructionmethod(初始化\销毁 方法)
Bean作用域(Scope)
Singleton:(默认)单例,只有一份
Prototype:每次请求创建新实例,destroy方式不生效
Request:http请求创建一个实例且仅在当前request内有效
Session:每次http请求创建,当前session有效
Globalsession:基于portlet的web中有效,若在web中,同seesion
Bean的生命周期
定义(配置文件)-初始化(容器加载配置文件生成Bean的实例)-使用(从Bean容器中取出使用)-销毁(Bean容器停止)
初始化与销毁方式:
实现接口:
org.springframework.beans.factory.InitializingBeanafterPropertiesSet()
org.springframework.beans.factory.DisposableBeandestroy()
配置Bean属性:
init-method="方法名"
destroy-method="方法名"
配置全局的Beans的默认:
default-init-method=""
default-destroy-method=""
顺序:接口先,配置后。全局的在没有初始化和销毁的情况下才会使用
注意:配置的如果不写出方法会抛异常,全局配置的不会
Aware接口
Spring提供一些以Aware结尾的接口,实现了接口的bean在初始化之后可以获取(自动注入)相应资源。通过Aware接口可以对Spring相应资源进行操作。为对Spring进行简单的扩展提供方便的入口
ApplicationConextAware:对实现了这个接口的Bean能提供ApplicationContext
BeanNameAware:提供BeanName的一些内容
等等
Autowiring自动装配
依赖注入的两种方式,一种是set,一种是构造器注入,现在不依靠这两种方式可以自动装配。
No:(默认)不做任何操作
byname:根据属性名自动装配其他bean的Id。将检查容器并根据名字查找与属性完全一致的bean并将其与属性自动装配
byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,则抛异常,并指出不能使用byType方式进行自动装配;如果没有找到,则不发生(需定义set方法)
Contructor:与byType类似,不同之处在于它应用于构造参数,没有找到与构造器参数类型的bean,那么抛异常
byType的对bean的id没有要求,baName的对bean的成员变量要自动注入则成员变量的名字要与相应的bean的名字一样
Resources
针对资源文件的统一接口
通过spring加载文件可以用它完成
1.UrlResource:url对应的资源
2.ClassResource:获取类路径下的对应文件
3.FileSystemResource:绝对的路径在当前的文件系统
4.ServletContextResource:适合web相关的
5.InputStreamResource:输入流的封装
6.ByteArrayResource:针对字节数组
ResourceLoader:
ApplicationContext都有实现这个接口,所有的ApplicationContext都能获取实例
Resourcetemplate = ctx.getResource("");
Prefix:classpath;file;http;none(依赖于applicationContext)
注解篇—Bean
Classpath扫描与组件管理
Spring3.0开始,Spring JavaConfig提供很多特性如使用Java而不是XML定义bean
类的自动检测与注册bean
配置
使用过滤器自定义扫描
可以使用use-default-filter=“false“禁止使用自动发现或注册。
类型有注解、自定义、通配符正则表达式、aspectJ等
@Component、@Repository、@Service、@Controller…
元注解(Meta-annotations)
注解的注解,注解可以注解另一个注解,另一个注解可以继承所有特性。基于Spring的注解定义自己的注解
Bean定义
扫描过程中组件会自动检测,Bean的名称是由BeanNameGenerator生成的(@Component、@Repository、@Service、@Controller都有name属性用于显示设置BeanName),若不设置则默认解析为类的第一个字母小写;也能实现BeanNameGenerator接口自定义命名策略,一定要包含无参数构造器。
实现:在Component-scan的属性name-generator指定自己命名的策略
作用域:
类上的注解@Scope标识一个Bean,默认是singleton单例,可设置prototype
可自定义scope策略,实现ScopeMetadaraResolver接口并提供无参构造器,如在每一个线程都有一个
代理方式:
可使用scoped-proxy属性指定代理,no;interfaces;targetClass
@Required(不常用)
适用bean属性的setter方法,表示bean属性必须在配置时赋值。
@Autowired
1.可用于setter方法、构造器和成员变量。
2.默认情况下(属性required=”true”)找不到合适的bean会导致autowiring失败,设为false市找不到合适的bean就不会抛出异常。
3.每个类只有一个构造器标记为required=”true”。
4.Autowired的必要属性,使用@Required
5.可使用它注解Spring自己的解析依赖性接口如:BeanFactory、ApplicationContext、Environment、ResourceLoader、ApplicationEventPublisher、MessageSource
6.可以通过添加注解需要该类型的集合的字段或方法,提供ApplicationContext中所有特定类型的bean,如Set
7.是由SpringBeanPostProcessor处理的,不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,只能通过XML或@Bean注解加载。
@Qualifier
1.按类型自动装配有多个bean的时候,在指定成员变量、单独的构造器参数或方法参数上标注@Qualifier(“name”),缩小范围
配置文件中实现
@Resource
1.如果通过名字进行注入,使用JSR-250的@Resource,它是通过独特的名称来定义来识别特定的目标
2.集合或Map的bean无法通过@Autowired注入,因为没有类型匹配到这样的bean,为这些bean使用@Resource注解,通过唯一名称引用集合或Map的bean
综上三个注解
1.@Autowired适用于fields,constructors,multi-argument methods这些允许在参数级别使用@Qualifier注解缩小范围的情况
2.@Resource适用于成员变量、只有一个参数的setter方法,所以目标是构造器或一个多参数方法时,最好使用qualifiers
基于java的容器注解
@Bean
1.标识一个用于配置和初始化一个由SpringIoC容器管理的新对象的方法,类似于XML配置文件的
2.可以在Spring的@Component注解的类中使用@Bean注解任何方法
3.通常在@Configuration里面使用@Bean
4.自定义Bean name、初始化方法和销毁方法
@Bean(name=””,initMethod=””,destroyMethod=””)
5.若使用Bean注解,没有指定name,那方法就是它的name
@ImportResource和@Value
使用两个进行资源文件读取。
1.类上添加两个注解@Configuration与@ImportResource(“classpath:/xxx/xxx/xxx/xxx.xml”)
2.xml中
3.成员变量上添加@Value(“$(.properties文件中的key)”),通过其赋值给这个成员变量
4.再使用@Bean创建一个SampleClass类,将成员变量的值传入SampleClass类的构造器
注意:properties文件中的key命名不要和操作系统的重合,否则取到的是操作系统的值,即命名要个性化
@Bean和@Scope
默认@Bean是单例的
在@Bean下写注解@Scope(value=””, proxyMode=””)
基于泛型的自动装配
1.泛型接口Store
2.两个类实现Store
3.成员变量privateStore
4.@Configuration注解下的类新增两个@Bean:返回StringStore, IntegerStore类型的方法
Spring对JSR的支持
@Resource
注解在变量或setter方法上。有name属性,Spring解释该值为被注入bean的名称;没有指明name则根据变量或者setter解析。由ApplicationContext中CommonAnnotationBeanPostProcessor类去发现并处理。
@PostConstruct和@PreDestroy
1.Spring2.5中引入支持初始化回调和销毁回调,前提是CommonAnnotationBeanPostProcessor是Spring的ApplicationContext中注册的。
2.用在方法上,和配置文件的init-metohd、destroy-method的初始化,销毁是一样的
3.JSR330,@Inject等效于@Autowired,用于类、属性、方法、构造器;@Named使用特定名称依赖注入,等效@Component