博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Spring - 03配置文件

Posted on 2020-11-17 20:52  Kingdomer  阅读(84)  评论(0)    收藏  举报

Spring - 03配置文件

(1)Bean标签

(1.1)Bean标签基本配置

用于配置交由Spring来创建的对象。默认情况下,它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

基本属性: 

    id:    Bean实例在Spring容器中的唯一标识

    class: Bean的全限定名称

(1.2)Bean标签范围配置

scope:指对象的作用范围,取值如下:

取值范围 说明
singleton
默认值,单例的
prototype
多例的
request
WEB项目中,Spring创建一个Bean对象,将对象存入到request域中
session
WEB项目中,Spring创建一个Bean对象,将对象存入到session域中
global session
WEB项目中,应用在Portlet环境,如果没有Portlet环境,那么 globalSession相当于session

 

 

 

 

 

 

 

 

 

(1.3)测试singleton

<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl" scope="singleton"></bean> 
public class UserDaoImpl implements UserDao {

    public UserDaoImpl(){
        System.out.println("UserDaoImpl 创建了......");
    }
    public void save() {
        System.out.println("UserDao Save 执行了.....");
    }
}

// main 方法
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
UserDaoImpl 创建了......
com.bearpx.sp01basic.dao.impl.UserDaoImpl@5e3a8624
com.bearpx.sp01basic.dao.impl.UserDaoImpl@5e3a8624

(1.4)测试prototype

<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl" scope="prototype"></bean>  

UserDaoImpl 创建了......
UserDaoImpl 创建了......
com.bearpx.sp01basic.dao.impl.UserDaoImpl@27efef64
com.bearpx.sp01basic.dao.impl.UserDaoImpl@6f7fd0e6

(1.5)总结

当scope取值为singleton时,Bean只有一个,当Spring核心文件被加载时,创建容器时,实例化配置的Bean。应用卸载,销毁容器时,对象被销毁。

当scope取值为prototype时,Bean有多个,当调用getBean()方法时实例化Bean。 当对象长时间不用时,被Java垃圾回收器回收。

 

(2)Bean生命周期配置

    init-method:   指定类中的初始化方法名称

    destroy-method:指定类中的销毁方法名称

    public void initUserDao(){
        System.out.println("UserDaoImpl初始化方法......");
    }
    public void destoryUserDao(){
        System.out.println("UserDaoImpl销毁方法......");
    }

 

    <bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"
          init-method="initUserDao" destroy-method="destoryUserDao"></bean>
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
System.out.println(userDao);
((ClassPathXmlApplicationContext) app).close();

 

信息: Loading XML bean definitions from class path resource [applicationContext.xml]
UserDaoImpl 创建了......
UserDaoImpl初始化方法......
十一月 05, 2020 8:56:34 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@4d405ef7: startup date [Thu Nov 05 20:56:34 CST 2020]; root of context hierarchy
com.bearpx.sp01basic.dao.impl.UserDaoImpl@5c3bd550
UserDaoImpl销毁方法......

 

(3)Bean实例化的三种方式

  • 无参构造方法实例化
  • 工厂静态方法实例化
  • 工厂实例方法实例化

(3.1)无参构造方法

<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl" scope="prototype"></bean>  

(3.2)工厂静态方法

public class StaticFactory {
    public static UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
 <bean id="userDao" class="com.bearpx.sp01basic.factory.StaticFactory" factory-method="getUserDao"></bean>

 (3.3)工厂实例方法

public class DynamicFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
   <bean id="factory" class="com.bearpx.sp01basic.factory.DynamicFactory"></bean>
   <bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>

 

(4)依赖注入

(4.1)依赖注入分析

目前UserService实例和UserDao实例都存在于Spring容器中,当前的做法是在容器外部获取UserService实例和UserDao实例,然后在程序中结合。

getBean(name:"userService")获取UserService实例,发现UserService实例内部需要UserDao实例的save方法,所以在UserService内部获得UserDao实例

getBean(name:"userDao")相当于在Spring容器外将Dao组装到Service内部完成的操作。

(4.2)Bean依赖注入概念

依赖注入(Dependency Injection):它是Spring框架核心IOC的具体实现。

在编写程序时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况。

IOC解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。业务层和持久层的依赖关系,在使用Spring后,由Spring维护了。

坐等框架把持久层对象传入业务层,而不用我们自己去获取。

(4.3)Bean的依赖注入方式

  • 构造方法
  • set方法

 p命名空间注入本质也是set方法注入,比较方便,加入 xmlns:p="http://www.springframework.org/schema/p",修改注入方式

public class UserServiceImpl  implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao){  // setter方法设置属性
        this.userDao = userDao;
    }
    public void save() {
        userDao.save();
    }
}
   <bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"></bean>
   <bean id="userService" class="com.bearpx.sp01basic.service.impl.UserServiceImpl">
       <property name="userDao" ref="userDao"></property>
   </bean>
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.bearpx.sp01basic.service.impl.UserServiceImpl" p:userDao-ref="userDao"></bean>

 

public class UserServiceImpl  implements UserService {
    private UserDao userDao;

    public UserServiceImpl(UserDao userDao){   // 构造器
        this.userDao = userDao;
    }
//    public void setUserDao(UserDao userDao){
//        this.userDao = userDao;
//    }
    public void save() {
        userDao.save();
    }
}
    <bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"></bean>
    <bean id="userService" class="com.bearpx.sp01basic.service.impl.UserServiceImpl">
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>

 

(5)Bean的依赖注入的数据类型

上面都是注入的引用Bean, 除了对象的引用可以注入,普通数据类型、集合等都可以在容器中进行注入。

注入数据的三种数据类型:

  • 普通数据类型
  • 引用数据类型
  • 集合数据类型

 (5.1)普通数据类型

public class UserDaoImpl implements UserDao {
    private String userName;
    private int age;

    public void setUserName(String userName){
        this.userName = userName;
    }
    public void setAge(int age){
        this.age = age;
    }

    public void save() {
        System.out.println(userName + "======" + age);
        System.out.println("UserDao Save 执行了.....");
    }
}
    <bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl">
        <property name="userName" value="wukong"/>
        <property name="age" value="590"/>
    </bean>

 输出:

wukong======590
UserDao Save 执行了.....

 (5.2)集合数据类型

package com.bearpx.sp01basic.domain;

public class User {
    private String name;
    private String addr;
    // 省略 getter 和 setter 方法
}

 

public class UserDaoImpl implements UserDao {
    
    private List<String> strList;
    private Map<String, User> userMap;
    private Properties properties;
    // 省略 getter 和 setter 方法
    public void save() {
        System.out.println(strList);
        System.out.println(userMap);
        System.out.println(properties);
        System.out.println("UserDao Save 执行了.....");
    }
}

 注入List

    <bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl">
        <property name="strList">
            <list>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </list>
        </property>
    </bean>
[aaa, bbb, ccc]

 注入Map

    <bean id="user1" class="com.bearpx.sp01basic.domain.User">
        <property name="name" value="sunwukong"/>
        <property name="addr" value="huaguoshan"/>
    </bean>
    <bean id="user2" class="com.bearpx.sp01basic.domain.User">
        <property name="name" value="zhubajie"/>
        <property name="addr" value="gaolaoguang"/>
    </bean>
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"> <property name="userMap"> <map> <entry key="u1" value-ref="user1"/> <entry key="u2" value-ref="user2"/> </map> </property> </bean>
{u1=User{name='sunwukong', addr='huaguoshan'}, u2=User{name='zhubajie', addr='gaolaoguang'}}

 注入Properties

    <bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl">
        <property name="properties">
            <props>
                <prop key="p1">ppp1</prop>
                <prop key="p2">ppp2</prop>
                <prop key="p3">ppp3</prop>
            </props>
        </property>
    </bean>
{p3=ppp3, p2=ppp2, p1=ppp1}

 

(6)引入其他配置文件

 实际开发中,Spring的配置内容非常多,导致Spring配置很繁杂且体积很大,可以将部分配置拆解到其他配置文件中,主配置文件通过import标签进行加载。

<import resource="applicationContext-user.xml"></import>

applicationContext-user.xml配置文件: