Spring基础—Bean容器

大纲

引入:面向接口编程

控制反转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”);

<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配置的时候完成对(成员)变量的赋值行为。

设值注入 — 类中要有相应的set方法,在配置文件的bean中添加属性<property name="这里是成员变量属性名" ref="这里是另一个Bean的Id">

构造注入 — 类中要有相应的构造器,添加<constructor-arg name="这里是成员变量属性名" ref="这里是另一个Bean的Id">

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自动装配

<beans default-autowire=”byName”></beans>

依赖注入的两种方式,一种是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

<context: component-scan/>、<context:annotation-config/>

配置<context: component-scan/>,属性base-package=“”,扫描包范围下的。包含<context:annotation-config>。Scan能扫描类上的注解,annotation则是完成Bean的注册之后,扫描Bean中方法上的。使用前面的就可以了。会把AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor包含进来。

使用过滤器自定义扫描

<beans>
       <context:component-scan base-pakage=“”>
              <context:include-filter type=”regex”expression=”.*Stub.*Repository”/>
              <context:exclude-filter type=”annotation”expression=””/>
       </context:component-scan>
</beans>

可以使用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接口并提供无参构造器,如在每一个线程都有一个

<context:component-scan base-pakage=“” scope-resolver=“”/>

代理方式:

可使用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<SampleClass>、List<SampleClass>、Map<SampleClass>,Spring会从ApplicationContext找出所有SampleClass类以及子类放入集合中。若希望List有顺序则实现Ordered接口或使用@Ordered注解。

7.是由SpringBeanPostProcessor处理的,不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,只能通过XML或@Bean注解加载。

@Qualifier

1.按类型自动装配有多个bean的时候,在指定成员变量、单独的构造器参数或方法参数上标注@Qualifier(“name”),缩小范围

配置文件中实现<bean class=””><qualifier value=””></bean>

@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配置文件的<bean/>

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中

<beans>
       <context: property-placeholderlocation=”classpath:/xxx/xxx/xxx/xxx.properties”>
</beans>

3.成员变量上添加@Value(“$(.properties文件中的key)”),通过其赋值给这个成员变量

4.再使用@Bean创建一个SampleClass类,将成员变量的值传入SampleClass类的构造器

注意:properties文件中的key命名不要和操作系统的重合,否则取到的是操作系统的值,即命名要个性化

@Bean和@Scope

默认@Bean是单例的

在@Bean下写注解@Scope(value=””, proxyMode=””)

基于泛型的自动装配

1.泛型接口Store<T>

2.两个类实现Store<T>:StringStore implements Store<String>; IntegerStore implementsStore<Integer>

3.成员变量privateStore<String> s1; private Store<Integer> s2;添加注解@Autowired

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring bean 容器的生命周期可以分为三个阶段:实例化、初始化和销毁。 1. 实例化阶段:在这个阶段,Spring 容器会根据配置信息创建 bean 的实例。根据配置的不同,Spring 可以通过构造函数实例化 bean,也可以通过工厂方法来创建实例。在这个阶段,Spring 只是创建了对象的实例,并没有进行属性注入或其他初始化操作。 2. 初始化阶段:在实例化后,Spring 容器会对 bean 进行初始化。这个阶段包括以下几个步骤: - 属性注入:Spring 容器会将配置的属性值注入到 bean 的属性中,可以通过 XML 配置或注解来完成属性注入。 - Aware 接口回调:如果 bean 实现了 Aware 接口,容器会调用相应的回调方法,让 bean 对容器的一些特定情况做出响应。 - 自定义初始化方法:如果在配置中指定了自定义的初始化方法,Spring 容器会调用该方法进行额外的初始化操作。 3. 销毁阶段:当 Spring 容器关闭时,会触发 bean 的销毁操作。销毁阶段包括以下几个步骤: - 实现 DisposableBean 接口:如果 bean 实现了 DisposableBean 接口,容器会调用其 destroy() 方法进行销毁操作。 - 自定义销毁方法:如果在配置中指定了自定义的销毁方法,Spring 容器会调用该方法进行额外的销毁操作。 需要注意的是,对于单例作用域的 bean,默认情况下 Spring 容器会管理其完整的生命周期,而对于原型作用域的 bean,Spring 容器只负责创建和初始化,不会进行销毁操作,需要手动释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值