Spring--4.标签 生命周期 服务启动(bean管理xml)

1       常用属性,子标签

1.1  属性

 


1.2  子标签

1.3  作用域--scope属性

使用scope设置作用域

    singleton :默认,单例的,初始化创建bean,整个生命周期只创建一个bean

    prototype :原型的,初始化不创建bean,每次请求创建一个bean,并返回

 

 

1.4  字面值—处理特殊字符

       字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。

       若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。

<value><![CDATA[<北京>]]></value>

 

 

2       Bean 的生命周期-- init-method和destroy-method

2.1  生命周期方法

 

       SpringIOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.

       SpringIOC 容器对 Bean 的生命周期进行管理的过程:

1.        通过构造器或工厂方法创建Bean 实例

2.        为 Bean 的属性设置值和对其他 Bean 的引用

3.        调用 Bean 的初始化方法

4.        Bean 可以使用了

5.        当容器关闭时, 调用 Bean 的销毁方法

       在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.

<bean id="car" class="spring.cycle.Car"init-method="init"destroy-method="destory">
       <property name="brand"value="奥迪"></property>
    </bean> 

2.2  创建 Bean 后置处理器

 

       Bean后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.

       Bean后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.

       对Bean 后置处理器而言, 需要实现BeanPostProcessor接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:

 

<!-- 配置bean的后置处理器 -->
    <bean class="spring.cycle.MyBeanPostProcessor"></bean>

bean-cycle.xml

<?xml version="1.0"encoding="UTF-8"?>
<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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd">
 
    <bean id="car"class="spring.cycle.Car" init-method="init" destroy-method="destory">
       <property name="brand"value="奥迪"></property>
    </bean>
 
    <!--
    实现 BeanPostProcessor
       postProcessBeforeInitialization(Objectbean, String beanName):init-method()之前
       postProcessAfterInitialization(Objectbean, String beanName):init-method()之后
       的实现:
   
    bean:bean的实例本身
    beanName:IOC容器的 bean 名字
    返回值:是实际上返回给用户那个bean,注意:可以修改bean,对应好就行,甚至返回一个新的 bean
    -->
    <!-- 配置bean的后置处理器:不需要配置ID, IOC容器自动识别是一个  BeanPostProcessor-->
    <bean class="spring.cycle.MyBeanPostProcessor"></bean>
 
</beans>

MyBeanPostProcessor

package spring.cycle;
 
import org.springframework.beans.BeansException;
importorg.springframework.beans.factory.config.BeanPostProcessor;
 
public class MyBeanPostProcessor implements BeanPostProcessor {
 
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
           throws BeansException {
       System.out.println("postProcessAfterInitialization:" + bean +","+beanName);
       Car car = new Car();
       car.setBrand("宝马");
       return car;
    }
 
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
           throws BeansException {
       System.out.println("postProcessBeforeInitialization:" + bean +","+beanName);
      
      
       return bean;
    }
}
Car
package spring.cycle;
 
public class Car {
 
    private String brand ;
   
    public String getBrand() {
       return brand;
    }
 
    public void setBrand(String brand) {
       System.out.println("为属性赋值:setBrand..."+brand);
       this.brand = brand;
    }
   
    public Car() {
       System.out.println("Car启动...");
    }
 
    public void init(){
       System.out.println("初始化...");
    }
   
    public void destory(){
       System.out.println("销毁...");
    }
 
    @Override
    public String toString() {
       return "Car[brand=" + brand + "]";
    }
}

2.3  添加 Bean 后置处理器后 Bean 的生命周期

过程:

1.        通过构造器或工厂方法创建Bean 实例

2.        为 Bean 的属性设置值和对其他 Bean 的引用

3.        将 Bean 实例传递给 Bean 后置处理器的postProcessBeforeInitialization 方法

4.        调用 Bean 的初始化方法

5.        将 Bean 实例传递给 Bean 后置处理器的postProcessAfterInitialization方法

6.        Bean 可以使用了

7.        当容器关闭时, 调用 Bean 的销毁方法

 

 

 

3      缓存—随tomcat启动

3.1  问题来源

撸主公司接了个小项目,有一张字典表会反复使用,如果去反复查询数据库,有点得不偿失,然而使用redis就有点大材小用,就想到用static属性在java里面弄一个map集合,就可以实现

 

3.2  第一步 在spring中配置前置方法

在applicationContext.xml文件添加前置方法,注意属性

<bean class="com.kun.devlop.service.CacheService"init-method="initMethod"></bean>

 

3.3  第二步 实现类(建议单例模式)

3.3.1      定义一个静态CACHE缓存变量

 

private staticMap<String, List<Map<String, Object>>> CACHE = new HashMap<String,List<Map<String, Object>>>();

3.3.2      前置方法

 

3.3.3      完整参考代码

public classCacheService {
 
   @Autowired
   private MetaTableFieldDao metaTableFieldDao;
 
   @Autowired
   private SqlQuery sqlQuery;
 
   private static Map<String,List<Map<String, Object>>> CACHE = new HashMap<String, List<Map<String,Object>>>();
 
   public void initMethod(){
      //1.获得所有不重复FieldMapping
      List<String>fieldMappings= metaTableFieldDao.findDisFieldMapping();
     
      if (fieldMappings != null && fieldMappings.size() > 0) {
         for (String  fieldMapping : fieldMappings){
            if (fieldMapping != null &&  !"".equals(fieldMapping)&& !"0".equals(fieldMapping)) {
                StringmetaTableSql= "SELECT code, name, pinyin FROMfield_mapping  where catalog_code ='" + fieldMapping + "'";
                List<Map<String,Object>> list= sqlQuery.query(metaTableSql,"");
                if (list != null && list.size() > 0) {
                   CACHE.put(fieldMapping, list);
                }
            }
         }
      }
      System.out.println(CACHE.get("AFLB"));
   }
}


 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值