• SSM框架学习day02_配置文件


    三、Spring配置文件

    3.6 Bean的依赖注入分析

    1. 创建一个接口UserServers
    2. 创建一个Controller
    3. 将UserServers配置到Spring配置文件中
    4. Controller中创建spring容器,getbean获得Serverice对象。

    问题:
    UserService和UserDao实例都在Spring容器中,当前做法是在容器外部获得UserService和UserDao实例,然后在程序中进行结合。

    因为Service和Dao都在Spring容器中,而最终时使用Service,所以可以在Spring中,将UserDao设置到UserService的内部

    3.7 Bean的依赖注入概念

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

    虽然IOC解耦可以降低依赖关系,但不会消除,所以类似业务层和持久层的依赖关系,在使用Spring之后,就让Spring自己来维护。等框架把持久层对象传入业务层,而不是自己获取。

    将UserDao注入到UserService内部的两种方法

    • set方法
    • 构造方法

    1) set方法注入

    在applicationContext.xml文件中将UserDao传入UserService,通过set方法实现。
    applicationContext.xml

        <bean id="userDao" class="com.hf.dao.impl.UserDaoimpl" ></bean>
        <bean id="userService" class="com.hf.service.impl.UserServiceImpl">
            <property name="userDao" ref="userDao"></property>
        </bean>
    

    :name是set方法名称中set后的名字,但首字母小写

    UserServiceImpl.java

        private UserDao userDao;
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public void save() {
            userDao.save();
        }
    

    UserController.java

    public static void main(String[] args) {
            ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService userService = (UserService) app.getBean("userService");
            userService.save();
    }
    

    运行结果
    UserDaoImpl创建
    save running...

    实例是从Spring容器中获取的,所以如果将UserController改成

            UserService userService = new UserServiceImpl();
            userService.save();
    

    就会报空指针异常,因为Service中的UserDao无法获取。

    子标签property较麻烦,可采用P命名空间简化操作(本质也是set方法注入):
    首先需要引入P命名空间:

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

    然后在Bean中修改注入方式

    <bean id="userService" class="com.hf.service.impl.UserServiceImpl" p:userDao-ref="userDao"></bean>
    

    运行结果:
    UserDaoImpl创建
    save running...

    2) 构造方法注入

    首先将UserDao写入UserService构造方法中

        private UserDao userDao;
    
        public UserServiceImpl(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public UserServiceImpl() {
        }
    
        public void save() {
            userDao.save();
        }
    

    然后在配置文件中写明
    applicationContext.xml

        <bean id="userService" class="com.hf.service.impl.UserServiceImpl">
            <constructor-arg name="userDao" ref="userDao"></constructor-arg>
        </bean>
    

    set方法中property里的name代表的是bean的特定名称,而这里的name指的是往构造方法里传入的参数

    3.8 Bean的依赖注入的数据类型

    以上所学注入的都是引用的Bean,而除了Bean之外,还可以往容器中注入普通的数据类型和集合

    注入数据的三种数据类型

    • 普通数据类型
    • 引用数据类型
    • 集合数据类型
    1. 普通数据类型
      通过set方法(用构造方法也是一样的)
      UserDaoimpl.java中加入
        private String username;
        private int age;
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    

    在applicationContexet.xml中修改

        <bean id="userDao" class="com.hf.dao.impl.UserDaoimpl" >
            <property name="username" value="胡佛"/>
            <property name="age" value="18"/>
        </bean>
    

    运行结果:
    胡佛====18
    save running...

    1. 集合数据类型
      以List、Map、Properties为例

    UserDaoimpl.java中加入

        private List<String> strList;
        private Map<String, User>userMap;
        private Properties properties;
    
        public void setStrList(List<String> strList) {
            this.strList = strList;
        }
    
        public void setUserMap(Map<String, User> userMap) {
            this.userMap = userMap;
        }
    
        public void setProperties(Properties properties) {
            this.properties = properties;
        }
    
    

    新建domain.user.java

    public class User {
    
        private String name;
        private String addr;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAddr() {
            return addr;
        }
    
        public void setAddr(String addr) {
            this.addr = addr;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", addr='" + addr + '\'' +
                    '}';
        }
    }
    

    重点
    applicationContext.xml

        <bean id="userDao" class="com.hf.dao.impl.UserDaoimpl" >
            <property name="strList">
                <list>
                    <value>aaa</value>
                    <value>bbb</value>
                    <value>ccc</value>
                </list>
            </property>
            <property name="userMap">
                <map>
                    <entry key="u1" value-ref="user1"></entry>
                    <entry key="u2" value-ref="user2"></entry>
                </map>
            </property>
            <property name="properties">
                <props>
                    <prop key="p1">ppp1</prop>
                    <prop key="p2">ppp2</prop>
                    <prop key="p3">ppp3</prop>
                </props>
            </property>
        </bean>
    
        <bean id="user1" class="com.domain.User">
            <property name="name" value="tom"/>
            <property name="addr" value="huangshan"/>
        </bean>
        <bean id="user2" class="com.domain.User">
            <property name="name" value="jack"/>
            <property name="addr" value="tunxi"/>
        </bean>
    
    

    properties中两边都是字符串

    运行结果
    [aaa, bbb, ccc]
    {u1=User{name='tom', addr='huangshan'}, u2=User{name='jack', addr='tunxi'}}
    {p3=ppp3, p2=ppp2, p1=ppp1}
    save running...

    3.9 引入其他配置文件(分模块开发)

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

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

    Spirng的重点配置

    <bean>标签
      id属性:在容器中Bean实例的唯一标识,不允许重复
      class属性:要实例化的Bean的全限定名
      scope属性:Bean的作用范围,常用是Singleton(默认)和prototype
      <property>标签:属性注入
          name属性:属性名称
          value属性:注入的普通属性值
          ref属性:注入的对象引用值
          <list>标签
          <map>标签
          <properties>标签
      <constructor-arg>标签:构造函数参数,属性和内部子标签和bean是一样的。
    <import>标签:导入其他的Spring的分文件
    

    四、Spring相关API

    4.1 ApplicationContext的继承体系

    applicationContext:接口类型,代表应用上下文,可以通过其实例获得Spring容器中的Bean对象。

    紫色:接口
    浅绿色:抽象类
    绿色:两个实现

    4.2 ApplicationContext的实现类

    1. ClassPathXmlApplicationContext
      它是从类的根路径下加载配置文件,推荐使用
    2. FileSystemXmlApplicationContext
      从磁盘上加载配置文件,配置文件可以在磁盘的任意位置
    ApplicationContext app = new FileSystemXmlApplicationContext("D:\\study\\SpringMVC(ccc\\hf_Spring_ioc\\src\\main\\resources\\applicationContext.xml");
    
    1. ClassPathXmlApplicationContext
      使用注解配置容器对象时,需要用此类来创建spring容器,它来读取注解

    4.3 getBean()方法的使用

    第一种传入字符串,即ID,第二种传入字节码对象类型,Spring按照类型从容器中找到相应的匹配

            UserService userService = app.getBean(UserService.class);
    

    这种方式不用强转,因为已经告诉Spring我需要的类型.
    但当配置文件中存在多个相同类型的Bean时,使用此方法会报错,系统不知该选择哪个对象,此时应使用ID的方式。

  • 相关阅读:
    给存储过程传递一个表
    Linker problems with Borland builder
    Python内置函数super的不便之处
    接口测试基础
    接口测试工具篇postman
    接口测试工具篇jmeter
    git的使用
    git与pycharm结合使用
    抓包工具fiddler
    sql 中 case when 语法
  • 原文地址:https://www.cnblogs.com/ebym/p/16157175.html
Copyright © 2020-2023  润新知