spring学习笔记(配置XML文件)

  • 主要内容
    - 基本概念
    - Spring 的 IOC 操作
    - Bean 实例化的方式
    - Bean 标签的常用属性
    - 属性注入
    - 注入复杂属性
    - IOC 和 DI

基本概念

  1. Spring是一个开源的,轻量级的框架。
    (1)开源的:开源软件是将软件以源代码形式发布,并遵循GPL等开源协议,用户不仅能使用,而且可以对软件进行改进。
    (2)免费的:免费软件通常以二进制文件形式发布。用户虽然可以免费使用,但无权对软件进行任何修改。
    (3)轻量级:框架使用不需要依赖其他的东西。
  2. Spring的核心主要两部分
    (1)aop:面向切面编程。扩展功能不是修改源代码实现。
    (2)ioc:控制反转。把对象的创建不是通过 new 的方式来实现,而是交给 Spring 配置创建类对象。
  3. Spring是一站式框架
    (1) spring 在 javaEE 三层结构中,每一层都提供了不同的解决技术
    (2) web层:SpringMVC
    (3) service:Spring 的 IOC
    (4) dao层:Spring 的 jdbcTemplate

Spring的IOC操作

  1. 把对象的创建交给 Spring 进行管理
  2. ioc 操作两部分
    (1)ioc 的配置文件方式
    (2)ioc 的注解方式
  3. IOC 底层原理使用的技术
    (1)xml 配置文件
    (2)dom4j 解析 xml
    (3)工厂设计模式
    (4)反射

Bean实例化的方式

  • 在 Spring 里面通过配置文件创建对象
  • bean 实例化的三种方式实现(在spring.xml中配置bean标签)
    (1)第一种:使用类的无参数构造创建

         <bean id="user" class="com.study.User"></bean>
    

    注意:
    - id 表示名称,可以为任意名称,但不能包含特殊符号(不能加下划线)根据 id 得到配置对象
    - class 表示创建对象所在类的全路径
    - 使用这种配置方法,需要注意:配置文件中的类里面必须包含无参构造方法。否则会报错:

    Error creating bean with name 'user' defined in class path resource [spring.xml]: Instantiation of bean failed;
          nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.study.User]: No default constructor found;
          nested exception is java.lang.NoSuchMethodException: com.study.User.<init>()
    

    (2)第二种:使用静态工厂创建

    <bean id="user02" class="com.study.UserFactory" factory-method="getUser"></bean>
    

    其中 factory-method 用来表示:静态工厂类中获取对象的方法
    静态工厂的类 :

    public class UserFactory {
        public static User getUser(){
            return new User();
        }
    }
    

    (3)第三种:使用实例工厂创建

        <bean id="user03Factory" class="com.study.UserFactory2"></bean>
        <bean id="user03" factory-bean="user03Factory" factory-method="getUser"></bean>
    

    其中 factory-bean 用来表示:静态工厂类在配置文件中的 id 值
    实例工厂类:

    public class UserFactory2 {
        public User getUser(){
            return new User();
        }   
    }
    

Bean 标签的常用属性

  • id 名称:可以为任意名称,不能包含特殊符号(不能加下划线) 根据 id 得到配置对象
  • class: 创建对象所在类的全路径
  • name: 功能和 id 属性是一样的。但是属性值里面可以包含特殊符号(_ # 等) 针对整合 strut1 中的 action 名称。
  • scope:
    - singleton(默认值):单例
    - prototype:多例
    - request:创建对象,把对象放到request 域里面
    - session:创建对象,把对象放到 session 域里面
    - globalSession:创建对象,把对象放到 globalSession 域里面

属性注入

  1. 使用 set 方法注入(在 bean 标签里面加入 property 子标签)。

    <bean id="user" class="com.study.User" scope="prototype">
        <!-- 注入属性值 -->
        <property name="username" value="李四"></property>
     </bean>
    

    name :类里面定义的属性值。
    value :设置具体的值。
    注意:对应(User)类中要有对应属性的 set 方法。

  2. 使用有参构造注入(在 bean 标签里面加入 constructor-arg 子标签)。

    <bean id="user" class="com.study.User" >
        <constructor-arg name="username" value="张三"></constructor-arg>
     </bean>
    

    name :类里面定义的属性值。
    value :设置具体的值。

  3. 注入对象类型属性

     <bean id="user" class="com.study.User" scope="prototype"</bean>
    
     <!-- 注入对象类型属性 -->
     <bean id="admin" class="com.study.Admin">
        <property name="user" ref="user"></property>
     </bean>
    

    name 属性值:service 类里面属性名称。(现在不用 value 属性,因为刚才是字符串,现在是对象)。
    ref 属性:dao 配置 bean标签中 id 值。

  4. p 名称方式注入
    引入约束(p必须是小写)

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

    在 bean 中配置(p 必须小写)

    <bean id="user" class="com.study.User" p:username="p名称注入"></bean>
    <bean id="adminP" class="com.study.Admin" p:user-ref="user"></bean>
    

    注意:字母必须为小写p 否则报错(错误为把 p 改为 z)

    Configuration problem:
    Unable to locate Spring NamespaceHandler for XML schema
    namespace [http://www.springframework.org/schema/z]

注入 复杂属性

  1. 首先要在对应类中定义对应的属性,并且生成对应的 set 方法。

    private String[] arr;
    private List<String> list;
    private Map<String,String> map;
    private Properties prop;
    
    public void setUser(User user) {
        this.user = user;
    }
    
    public void setArr(String[] arr) {
        this.arr = arr;
    }
    
    public void setList(List<String> list) {
        this.list = list;
    }
    
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    
    public void setProp(Properties prop) {
        this.prop = prop;
    }
    
  2. 在 Spring.xml 中进行相应的配置

    <!-- 注入 复杂属性 -->
    <bean id="adminList" class="com.study.Admin">
        <!-- 注入数组属性 -->
        <property name="arr">
            <list>
                <value>"1"</value>
                <value>"2"</value>
                <value>"3"</value>
            </list>
        </property>
    
        <!-- 注入 list 属性 -->
        <property name="list">
            <list>
                <value>"a"</value>
                <value>"b"</value>
                <value>"c"</value>
            </list>
        </property>
    
        <!-- 注入 map 属性 -->
        <property name="map">
            <map>
                <entry key="a" value="1"></entry>
                <entry key="b" value="2"></entry>
                <entry key="c" value="3"></entry>
            </map>
        </property>
    
        <!-- 注入 Properties 属性 -->
        <property name="prop">
            <props>
                <prop key="key">value</prop>
                <prop key="key1">value1</prop>
            </props>
        </property>
    
    </bean>
    

IOC 和 DI

IOC:控制反转,把对象创建交给 spring 进行配置
DI:依赖注入,向类里面的属性中设置值

关系:
依赖注入不能单独存在,需要在 IOC 基础之上完成操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值