Spring配置详解

Spring配置详解

1.配置Bean元素

  

<!--配置bean元素
             name:给对象起个名字  class 类的完整路径名  
              id:唯一 不能出现特殊字符 struts
Id一般不用 -->
<bean name="user" class="cn.hd.test.User" id="user"></bean>

2.创建方式

 <!--scope 对象的创建方式
         singleton  单例模式(默认)
         prototype    多例模式(什么时候用什么时候创建 并且创建的方式每次重新new)
         request     web坏境下 对象的生命周期和request一样   不用
         session       web环境下 对象的生命周期和session一样   不用
    -->
<bean name="user" class="cn.hd.test.User" id="user" scope="prototype"></bean>

       一般情况下全部默认

     多例模式,在整合strtus2的时候action必须使用多例模式

3.创建生命周期的方法

  在对象创建后马上执行一个方法

  对象销毁前执行一个方法

 <bean name="user" class="cn.hd.test.User" id="user" init-method="init" destroy-method="destroy"></bean>

在user类中书写init方法和destroy方法测试,可以手动去销毁对象 调ClassPathXmlApplicationContext的close 

 如果你不去关闭 ,你会看不到destroy的方法执行

     注意:销毁对象,对象必须是单例的,如果是多例的无法手动创建


 Spring创建对象的方式

   (1)无参数的构造函数(重点使用)

      (2)静态工厂实例化

    <bean name="createUser" class="cn.hd.test.UserFactory" factory-method="createUser"></bean>

    并且创建一个UserFactoy 该类中提供一个静态的createUser方法

     public static  User createUser(){
     System.out.println("静态工厂的创建");
    return new User();
    }

(3)实例化工厂创建

                                                   

<bean name="userFactory" class="cn.hd.test.UserFactory"></bean>
    <bean name="user1" factory-bean="userFactory" factory-method="createUser1"></bean>

 

public User createUser1(){


    System.out.println("实例化工厂创建");

    return new User();

}


                                     属性注入


(1)set注入(最重要的)

   基本属性   8大基本数据类型+String

<bean name="car" class="cn.hd.injection.Car">
    <property name="name" value="小电驴"></property>
    <property name="color" value="红色"></property>

</bean>

  name 属性名   value 属性值

   引用属性   对象

<bean name="user" class="cn.hd.injection.User">
    <!-- 给那个属性进行赋值-->
    <property name="name" value="张二狗"></property>
    <property name="age" value="12"></property>
    <property name="car" ref="car"></property>


</bean>

name  :类的属性  ref:引用的bean的name

   (2)构造函数注入

 

<bean name="user1" class="cn.hd.injection.User">
    <constructor-arg name="name" value="李二狗" index="0" type="java.lang.String"></constructor-arg>
    <constructor-arg name="car" ref="car" index="1"></constructor-arg>
</bean>

 name: 属性

 vaule:具体的值

  index:参数的位置

  type:参数的类型

(3)p空间注入最简单 但是在市场上不认可

        导入约束

 

xmlns:p="http://www.springframework.org/schema/p"

http://www.springframework.org/schema/p

<bean name="user2" class="cn.hd.injection.User" p:age="12" p:name="张三公"
p:car-ref="car">


</bean>

(4)spel注入类似于EL 和Ognl表达式

<bean name="user3" class="cn.hd.injection.User">
    <property name="name" value="#{user2.name}"></property>
    <property name="car" value="#{car}"></property>
</bean>

数组:

 

<bean name="collectionBean" class="cn.hd.injection.CollectionBean">
        <!--数组中的元素只有一个那么它的配置和基本类型配置一样-->
       <!-- <property name="arr" value="1"></property>-->
    <property name="arr">
            <array>
                    <value>李二狗</value>
                   基础类型 <value>王麻子</value>
                   应用类型 <ref bean="car"></ref>
            </array>
    </property>
</bean>

 

CollectionBean collectionBean = (CollectionBean) ac.getBean("collectionBean");

Object[] arr = collectionBean.getArr();

for (Object o:arr){
    System.out.println(o);
}

 

List/set:

   <!--list集合中只有一个人元素配置和基本一样-->
<property name="list">
        <list>
                <value>张二狗</value>
                <value>李二狗</value>
                <ref bean="user"></ref>
        </list>
</property>

 

 

Map:

键值对 key-ref  value value-ref   Map<k,v >

<property name="map">
        <map>
                <entry key="name" value="李慧慧"></entry>
                <entry key="user" value-ref="user2"></entry>
               <!-- <entry key-ref=""></entry>-->
        </map>

</property>

 

Map map =collectionBean.getMap();

String name = (String) map.get("name");
System.out.println(name);

User user = (User) map.get("user");
System.out.println(user);

 

 

 

Properties(属性 java提供的一个类)

 

<property name="properties>">
        <props>
                <prop key="driverClass">com.</prop>
                <prop key="jdbcUrl">jdbc://localhost/..</prop>
                <prop key="user">root</prop>
        </props>

</property>

 

模块化

<import resource="classpath:applicationContext.xml"></import>

 

resource其他配置文件的地址

 

                                       使用注解配置spring

1.导包(4个核心包 +2个日志包+1aop包)

2、导入约束

 

xmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context.xsd 

 

1. 1.3指定扫描的包
<!--指定扫描的位置,自动扫描该包以及该包的所有子包-->
<context:component-scanbase-package="cn.hd.annotation"></context:component-scan> 
1.4为类声明注解在类声明书写一段代码(最原始的注解)
相当于在.xml中写的bean name=user class=cn.hd.annotation.User
@Component("user")
public classUser {
    privateStringname;
    privateStringage;
    privateStringaddress;
    privateCarcar;
为了解决所有的bean类都是一个注解,导致系统的层次不清晰,提出里三个注解@Conponent是一个泛化的概念,仅仅表示一个组件(Bean),可以作用在任何层次@Service通常作用在业务层,目前该功能与@Component相同@Constroller通常作用在控制层@Repository通常作用在dao层
@Component("user")(这个不是哦,也可以用)
    @Controller("user")//对应action  web层
        @Service("user")//service层
            @Repository("user")//dao 
没有强制要求,都可以用,提倡按照它的本意去注解修改scope属性
@Scope("scopeName=prototype") singleton/prototype单例和多例可以写request,response,session 
属性注入(1)值类型注解写在属性上面,同时也可以写在set方法上面
public classUser {
    @Value("张三")
    privateStringname;
    @Value("20")
    privateStringage;
    @Value("华点")
    privateStringaddress; 
 (2)引用类型@Autowired注释

它可以对类成员变量,方法以及构造函数进行标注,完成自动封装。(如果是多个不使用@Autowired)@Qualifier的标注对象是成员变量,方法入参,构造函数入参。@Qualifier只能和@Autowired结合使用,是对@Autowired有益的补充。一般来讲,@Qualifier对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,,面@Resource默认按byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,String将@resource注释的name属性解析为Bean的名字,而type属性则解析为Bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byName自动注入。如果既不指定name也不指定type属性,这时将会通过反射机制使用byName自动注入 
 

 @Autowired  //自动装配  如果只有一个对象,自动装配
  

@Qualifier("car2")  自动装配时有多个对象就要指定是哪个对象,与自动装配配合使用
 

 @Resource(name ="car") 直接指定配置哪个对象
  privateCarcar; 

 

 

 

3)创建对象后就执行的方法Spring容器中的bean是有生命周期的,spring允许在bean在初始化完成后以及bean销毁前执行特定的操作@PreDestory注解,而@PostConstruct则是在对象创建后执行的
@PostConstruct
public voidinit(){
    System.out.println("对象创建后自动执行");
}
@PreDestroy
public voiddestroy(){
    System.out.println("对象执行前销毁");
} @Test
public voidfun() {
    ClassPathXmlApplicationContext ac =newClassPathXmlApplicationContext("cn/hd/annotation/applicationContext.xml");
    User user = (User) ac.getBean("user");
    User user1 = (User) ac.getBean("user");
    System.out.println(user);
    ac.close();

Spring结合junit1.

 

1导包 

 

1.2书写测试代码 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cn/hd/annotation/applicationContext.xml")
public classDemo1 {
    @Resource(name ="user")
    privateUseruser;
    @Test
    public voidfun(){
        System.out.println(user);
    }

@RunWith(SpringJUnit4ClassRunner.class)结合Junit测试@ContextConfiguration("classpath:cn/hd/annotation/applicationContext.xml")读取文件配置 由于原来使用的是ApplicationContext对象,读取配置和获得bean对象,但是没有了,又想获得对象,这时可以使用下面的代码@Resource(name ="user")
privateUseruser; 

 

       
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值