首页

欢迎访问

Spring配置bean的方法

发布时间:2016-09-27 17:06:26

一,XML配置方式

1,1,通过构造方法注入

<!-- 若一个 bean 有多个构造器, 如何通过构造器来为 bean 的属性赋值 ,可以使用参数位置和类型,区分重载-->

<!-- 可以根据 index 和 value 进行更加精确的定位.  -->
<!-- 若字面值中包含特殊字符, 则可以使用 DCDATA 来进行赋值. -->
<bean id="bean" class="com.hello.Bean">
        <constructor-arg value="属性1值" index="0"></constructor-arg>
        <constructor-arg value="属性2值" index="1"></constructor-arg>
       <constructor-arg  value="属性3值" type="java.lang.String"></constructor-arg>
</bean> 
 
 
2, 注入属性值
<bean id="bean实例名" class="bean所在包">
        <constructor-arg  name="userName"  value="KUGA" ></constructor-arg>
    </bean>
2.1 list集合注入
<property name="lists">
<!-- 使用 list 元素来装配集合属性 -->
    <list>
        <ref bean="list"/>
        <ref bean="list2"/>
    </list>
</property>
 
也可外部声明全局lists
<!-- 声明集合类型的 bean,需要导入util命名空间 -->
<util:list id="lists">
    <ref bean="list1"/>
    <ref bean="list2"/>
</util:list>
 
2.2  使用 Map 元素来装配集合属性
<property name="maps">
    <map>
       <entry key="AA" value-ref="map1"></entry>
        <entry key="BB" value-ref="map2"></entry>
    </map>
</property>
 
2.3  p标签的使用,需要导入p标签库
<bean id="bean" class="包名" p:userName="属性值">
 
2.4
自动装配autowire属性
自动装配: 只声明 bean, 而把 bean 之间的关系交给 IOC 容器来完成
byType: 根据类型进行自动装配. 但要求 IOC 容器中只有一个类型对应的 bean, 若有多个则无法完成自动装配.
byName: 若属性名和某一个 bean 的 id 名一致, 即可完成自动装配. 若没有 id 一致的, 则无法完成自动装配
 
2.5
继承parent属性,子类也可以覆盖父类的属性值            
设置类为抽象类不可实例化,只能被继承abstract="true",若没指定class属性,则必须是抽象的 
 
2.6
默认情况下 bean 是单例的! 可以设置scope属性改变-
但有的时候, bean 就不能使单例的. 例如: Struts2 的 Action 就不是单例的! 可以通过 scope 属性来指定 bean 的作用域 
prototype: 原型的. 每次调用 getBean 方法都会返回一个新的 bean. 且在第一次调用 getBean 方法时才创建实例
singleton: 单例的. 每次调用 getBean 方法都会返回同一个 bean. 且在 IOC 容器初始化时即创建 bean 的实例. 默认值 
 
2.7  导入外部的资源文件,比如配置数据库连接属性,先建立db.properties文件,然后xml读取
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据库数据源 -->
<bean id="dataSource" class="com.jdbc.Jdbc_Connection">
   <property name="username" value="root"></property>
   <property name="password" value="${password}"></property>
   <property name="url" value="${url}"></property>
   <property name="driver" value="${driver}"></property>
</bean>
 
2.8 
配置初始化和销毁方法,init-method和destroy-method属性,可以实现bean的初始化和销毁时所处理的工作。
 
 
二,工厂方法
1,静态工厂方法
配置文件,
<!-- 1. 通过静态工厂方法: 一个类中有一个静态方法, 可以返回一个类的实例-->
<!-- 在 class 中指定静态工厂方法的全类名, 在 factory-method 中指定静态工厂方法的方法名 -->
    <bean id="bean" class="com.工厂方法配置Bean.StaticBeansFactory" factory-method="getBean"> 
        <constructor-arg value="关键字获取类实例"></constructor-arg><!-- 指定需要的实例 -->    
    </bean>
 
类实现
//////静态工厂方法
public class StaticBeanFactory {
    private static Map<String, bean(类名)> beans=new HashMap<String,类名>(); 
    
    static{
        beans.put("关键字1", new bean(构造方法));
 
        beans.put("关键字2", new bean(构造方法));
 
        beans.put("关键字3", new bean(构造方法));
    }
 
    public static Bean getBean(String name){//静态工厂方法,通过关键字调用类
        return beans.get(name);
    }
}
 
 
2,实例工厂方法
配置文件,
  <!-- 2. 实例工厂方法: 先需要创建工厂对象, 再调用工厂的非静态方法返回实例-->
<!-- ①. 创建工厂对应的 bean -->
<bean id="bean" class="com.工厂方法配置Bean.InstanceBeansFactory"></bean>
 
类实现
public class InstanceBeansFactory {
    private static Map<String, bean(类名)> beans=null;
 
    public InstanceBeansFactory(){
       beans=new HashMap<String,类名>(); 
        beans.put("关键字1", new bean(构造方法));
 
        beans.put("关键字2", new bean(构造方法));
 
        beans.put("关键字3", new bean(构造方法));
}
 
    public static Bean getBean(String name){//静态工厂方法,通过关键字调用类
        return beans.get(name);
    }
}
 
三,基于注解的配置方法
 
 
  • 特定组件包括:
    • @Component:基本注解,标示了一个受Spring管理的组件 (可以混用,spring还无法识别具体是哪一层)
    • @Respository:建议标识持久层组件 (可以混用,spring还无法识别具体是哪一层)
    • @Service:建议标识服务层(业务层)组件 (可以混用,spring还无法识别具体是哪一层)
    • @Controller:建议标识表现层组件(可以混用,spring还无法识别具体是哪一层)
  • 对于扫描到的组件, Spring有默认的命名策略 :使用非限定类名,第一个字母小写( UserServiceImpl-》userServiceImpl ), 也可以再注解中通过value属性值标识组件的名称(通常可以将UserServiceImpl —》userService,可以将Impl拿掉,这是一个习惯)
使用@Autowired@Resource注解方式进行装配 ,这两个注解的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到名称匹配的bean才会按类型装配。
 
<!-- 使用注解,自动扫描的包 -->
    <context:component-scan base-package="com.zhujie"  >
        <!-- 1,只扫描repository子包的类。resource-pattern="repository/*.class" -->
        <!-- 2,不扫描指定的表达式组件。"
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
         -->
               
        <!-- 3,只扫描指定的表达式组件。省略,注意use-default-filters="false"  -->
        
        <!-- 4,不扫描指定的类和接口。"         
        <context:exclude-filter type="assignable" expression="com.zhujie.repository.UserRepositoryImp1"/>
        -->    
    </context:component-scan>
 
 
我要评论+
评论列表