Spring的基本用法(二)

ApplicationContext的事件处理

采用观察着模式实现,通过ApplicationEvent 类和 ApplicationListener 类。

如果容器中有一个ApplicationListener Bean ,每当 ApplicationContext  发布 ApplicationEvent 时, ApplicationListener Bean 将自动相应。

1、 ApplicationEvent:容器事件,必须由 ApplicationContext 发布

2、 ApplicationListener :监听器

实现方法

public void onApplicationEvent(ApplicationEvent event){

if(event instanceof EamilEvent){

//send Email

}

}

*********************************************************************

Bean的基本定义

1、 id属性确定了该 Bean 的唯一标示符

2、 class属性指定给 Bean 的具体实现类

Bean的作用域

1、 singleton单态模式,在整个 Spring IoC 容器中,使用 singleton 定义的 Bean 将只有一个实例(默认使用的模式)

2、 prototype 原型模式,每个 getBean 都将产生一个新的 Bean 实例

3、 requeet 每次 HTTP 请求,产生一个新的 Bean 实例

4、 session 每次 HTTP Session 请求,产生一个新的 Bean 实例

5、 global session 每次 HTTP Session 请求,产生一个新的 Bean 实例,仅在使用  portlet context 的时候生效

<bean id="person1" class="vivi.Person" />

<bean id="person2" class="vivi.Person" scope="prototype" />

*********************************************************************

Spring的 BeanJavaBean

<!--定义数据源 Bean ,使用 C3P0 数据源实现 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destory-methos="close" >

<property name="driverClass" value="com.mysql.jdbc.Driver" / >

<property name="jdbcUrl" value="jdbc:mysql://localhost/vivi" / >

<property name="user" value="vivi" / >

<property name="password" value="vivi "/ >

<property name="maxPoolSize" value="40" / >

<property name="minPoolSize" value="1" / >

<property name="initialPoolSize" value="1" / >

<property name="maxIdleTime" value="20" / >

</bean>

可以得知,SpringBean 远远超出值对象的 JavaBean 范畴, Bean 可以代表应用中的任何组件和任何资源实例。

Spring Bean建议

1、 提供无参的构造器

2、 接受构造注入的Bean ,提供对应的构造函数

3、 接受设值注入的Bean ,听过对应的 setter 方法

*********************************************************************

获得容器的引用

Web应用,可能需要通过 Bean 来访问其所在的容器,让 Bean 直接访问容器。实现 BeanFactoryAware 接口的 Bean ,拥有直接访问容器的能力。

BeanFactoryAware接口只有一个方法:

void setBeanFactory(BeanFactory factory);

污染了代码,导致代码与Spring 接口耦合在一起,不建议直接访问容器

*********************************************************************

不同Bean 创建方式及对应配置

1、 使用new 关键字调用构造器

BeanFactory根据配置文件决定依赖关系,先实例化依赖的 Bean ,然后为 Bean 注入依赖关系,最后将一个完整的 Bean 实例返回给程序。

a) 程序创建BeanFactory 实例

b) 调用Chinese 类的默认构造器创建默认实例

c) 根据配置文件注入依赖关系,先实例化依赖Bean ,然后依赖 Bean 注入

d) 返回一个完整的JavaBean 实例

2、 BeanFactory调用某个类的静态工厂方法创建 Bean

class属性也是必须的,但 class 属性并不是该实例的实现类,而是静态工厂类。

使用factory-method 属性确定静态工厂的方法名, Spring 调用工厂方法

<!--factory-method产生实例的静态工厂方法 -->

<bean id="dog" class="vivi.BeingFactory" factory-method="getBeing">

<!--静态工厂方法的参数 -->

<constructor-arg vaelue="dog" />

<property name="msg" value="it's dog" />

</bean>

3、 BeanFactory调用实例工厂创建 Bean

必须提供工厂实例,因此必须在配置文件中配置工厂实例,无须class 属性。 BeanFactory 仅仅执行工厂方法,工厂负责产生 Bean 实例。

 factory-bean 属性的值为工厂 Beanid

※  factory-method 该方法负责生成 Bean 实例

<bean id="personFactory" class="vivi.PersonFactory">

<bean id="chinese" factory-bean="personFactory" factory-method="getPerson">

<constructor-arg value="chin" />

</bean>

*********************************************************************

深入理解容器中的Bean

Spring框架绝大多数工作都集中在对容器中 Bean 的管理,包括管理容器中 Bean 的生命周期,使用 Bean 继承等特殊功能。

使用抽象Bean

指定abstract 属性为 trueBean ,抽象 Bean 不能够被实例化,通常作为 Bean 模板使用。

对于Bean 继承而言,父 Bean 通常不需要实例化,而仅仅作为子 Bean 定义的模板使用。 ApplicationContext 默认预初始化所有的 singleton Bean ,为了阻止父 Bean 被预初化,可使用 abstract 属性设置父 Bean 为抽象 Bean 。容器会忽略所有的抽象 Bean 定义。

<bean id="chineseTemplate" class="vivi.Chinese" abstract="true">

<property name="axe" ref="steelAxe" />

</bean>

抽象Bean 无须实例化,可以没有 class 属性。

使用子Bean

Bean 定义可以从父 Bean 继承实现类、构造参数、属性值,也可以增加新的值。

指定init-methoddestory-methodfactory-method 属性,则会覆盖父 Bean 的定义。

通过设置parent 属性定义子 Beanparent 属性值为父 Bean id

<bean id="chinese1" parent="chineseTemplate" />

-----------------------------------------------------------------------

<!--覆盖父 Bean 的依赖定义 -->

<bean id="chinese2" parent="chineseTemplate" />

<property name="axe" ref="stoneAxe" />

</bean>

Bean继承与 Java 继承

前者是实例与实例之间参数的延续,后者是一般到特殊的细化。

前者是对象与对象之间的关系,后者是类与类之间的关系。

*********************************************************************

定制生命周期的行为

singleton 作用域的 BeanSpring 容器知道 Bean 何时实例化结束,何时销毁。可以管理实例化结束之后和销毁之前的行为。

1、 注入依赖关系之后

※  使用 init-method 属性

代码污染小。

<bean id="chinese" parent="vivi.Chinese" init-method="init"/>

<property name="axe" ref="stoneAxe" />

</bean>

※  实现InitializingBean 接口

侵入式设计

实现相同的效果,只是实现了InitializingBean 接口,该接口提供了一个 方法:

void afterPropertiesSet() throws Exception;

2、 即将销毁Bean 之前

※  使用 destory-method属性

※  实现DisposableBean 接口

*********************************************************************

协调作用域不同步的bean

※  当作用域不完全相同的Bean 相互引用时,可能出现一些问题。

※  singleton作用域 Bean 依赖于 prototype 作用域 Bean 时,会产生不同步的现象( singleton 初始化时候,依赖的 prototype 对象,已经更新,而 singleton 没有及时同步)。

※  解决方案:

a) 部分放弃依赖注入,singleton 每次需要非单态 Bean 时,主动向容器请求新的 Bean 实例。

b) 利用方法注入(通常使用lookup 方法:容器能够重写容器中 Bean 的抽象或具体方法,返回查找容器中其他 Bean 的结果,被查找的通常是一个 non-singleton Bean ), Spring 通过使用 CGLIB 库修改客户端的二进制码,从而实现上述的场景需求。

//方法注入所需要的方法,该方法由 Spring 提供实现

public sbstract Axe createAxe();

<bean id="steelAxe" class="vivi.SteelAxe" scope="prototype" />

<bean id="chinese" class="vivi.Chinese" >

<!--每次产生新的 prototype 作用域 Bean-->

<!--Bean属性,指定 lookup 方法的返回值 -->

<lookup-method name="createAxe" bean="steelAxe" />

<property name="axe" ref="steelAxe" />

</bean>

*********************************************************************

容器中的工厂Bean

※  前面介绍的工厂Bean ,必须手动配置其产品 Bean ,此处的工厂 Bean 只能为工厂使用, 无法获得工厂实例

※  Spring提供了 FactoryBean 接口,该接口是工厂 Bean 的标准接口。实现该接口的 Bean ,通常作为工厂 Bean 使用。 容器通常不会返回FactoryBean 实例,而是 FactoryBean 的产品。

※  FactoryBean接口提供了 3 个方法:

a)  Object getObject()

b)  Class getObjectType()

c)  boolean isSingleton() 

<bean id="personFactory" class="vivi.PersonFactory" />

Person p = (Person)factory.getBean("personFactory");

※  容器没有返回FactoryBean 实例,而是返回了 FactoryBean 的产品 Bean

※  如果需要返回FactoryBean 本身,可以采用如下方法

getBean(&beanId)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cache是Spring框架提供的一个缓存抽象层,可以方便地在应用中添加缓存功能。下面是Spring Cache的基本使用方法: 1. 添加依赖:在项目的pom.xml文件中添加Spring Cache的依赖项。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> ``` 2. 配置缓存管理器:在配置类中添加@EnableCaching注解,并配置缓存管理器。 ```java @Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { SimpleCacheManager cacheManager = new SimpleCacheManager(); cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("cacheName"))); return cacheManager; } } ``` 3. 在需要缓存的方法上添加缓存注解:使用@Cacheable注解来标记需要进行缓存的方法。 ```java @Service public class MyService { @Cacheable("cacheName") public String getData(String key) { // 这里是从数据库或其他外部资源获取数据的逻辑 return data; } } ``` 4. 测试缓存功能:在测试类中调用被缓存的方法,多次调用可以看到第一次调用时会执行方法体,后续调用则从缓存中获取结果。 ```java @SpringBootTest class CacheTest { @Autowired private MyService myService; @Test public void testCache() { String result1 = myService.getData("key"); String result2 = myService.getData("key"); // result1和result2的值应该相同,第次调用从缓存中获取结果 } } ``` 以上是Spring Cache的基本使用方法,通过配置缓存管理器和使用@Cacheable注解,可以轻松地在Spring应用中添加缓存功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值