Spring

Spring

  • 简介

    • spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
    • Spring为简化开发而生,让程序员只需关注核心业务的实现,尽可能的不再关注非业务逻辑代码(事务控制,安全日志等)
  • IoC(Inversion of Control)

    • 这是一种设计思想,可以降低代码间的耦合度,符合依赖倒置原则
    • 核心思想:
      • 将对象的创建权交出去
      • 将对象和对象之间关系的管理权交出去
      • 对象的创建和对象之间关系的维护都由第三方容器来负责
  • DI(Dependency Injection)

    • 实现IOC的方式有多种,其中比较重要的是DI(依赖注入)
    • 依赖注入用于实现对象之间关系的建立
    • 依赖注入的两种方式:
      • set注入;执行set方法给属性赋值
      • 构造方法注入:执行构造方法给属性赋值
  • spring八大模块:

    • 在这里插入图片描述
  • Bean:

    • spring配置文件

      • <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
            <bean id="userBean" class="com.powernode.spring6.bean.User" />
        </beans>
        
      • id:代表对象的唯一标识,看作一个人的身份证

      • class:指定创建对象的类名(全限定类目)

    • ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
      Object userBean = applicationContext.getBean("userBean");
      
    • BeanFactory是Spring容器的超级接口。ApplicationContext是BeanFactory的子接口。

    • spring的ioc容器底层实际上使用了工厂模式

    • spring是通过调用类的无参数构造方法来创建对象的,所以要想让spring给你创建对象,必须保证无参数构造方法是存在的。

    • spring创建对象的原理:

      • // dom4j解析beans.xml文件,从中获取class的全限定类名
        // 通过反射机制调用无参数构造方法创建对象
        Class clazz = Class.forName("com.powernode.spring6.bean.User");
        Object obj = clazz.newInstance();
        
    • Spring底层的IoC实现原理:XML解析+工厂模式+反射机制

    • 创建好的对象储存到HashMap中:

      • Map<String,Object>
      • key是id
      • value是bean
  • Set注入
    • 注入外部Bean:
      • <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
            <bean id="userDaoBean"  class="com.powernode.spring6.dao.UserDao" />
        
            <bean id="userServiceBean" class="com.powernode.spring6.service.UserService">
                <property name="userDao" ref="userDaoBean"/>
            </bean>
        </beans>
        
      • bean定义到外面,在property标签中使用ref属性进行注入

    • 注入内部Bean:
      • <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
            <bean id="userServiceBean" class="com.powernode.spring6.service.UserService">
                <property name="userDao">
                    <!--在property标签中使用嵌套的bean标签,这就是内部Bean-->
                    <bean class="com.powernode.spring6.dao.UserDao"/>
                </property>
            </bean>
        </beans>
        
    • 注入简单类型:
      • package com.powernode.spring6.bean;
        
        /**
         * @author shanglinsong
         * @version 1.0
         * @className com.powernode.spring6.bean.User
         * @date 2022/11/9
         * @since 1.0
         */
        public class User {
                 
                 
        
            private int age;
        
            @Override
            public String toString() {
                 
                 
                return "User{" +
                        "age=" + age +
                        '}';
            }
        
            public void setAge(int age) {
                 
                 
                this.age = age;
            }
        }
        
      • <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
            <bean id="userBean" class="com.powernode.spring6.bean.User">
                <!--<property name="age" value="20"/>-->
                <property name="age">
                    <!--如果像这种int类型的属性,我们称为简单类型,这种简单类型在注入的时候要使用value属性,不能使用ref-->
                    <value>20</value>
                </property>
            </bean>
        </beans>
        
      • 注意:如果给简单类型赋值,使用value属性或value标签,而不是ref。

      • 通过BeanUtils类源码分析得知,简单类型包括:

        • 基本数据类型及其包装类
        • String或其他CharSequence子类
        • Number子类
        • Date子类
        • Enum子类
        • URL和URI
        • Temporal子类
        • Local
        • Class
      • 注入数组k,.
        • 数组元素是简单类型

          • package com.powernode.spring6.bean;
            
            import java.util.Arrays;
            
            
            public class Person {
                         
                         
            
                private String[] favoriteFoods;
            
                @Override
                public String toString() {
                         
                         
                    return "Person{" +
                            "favoriteFoods=" + Arrays.toString(favoriteFoods) +
                            '}';
                }
            
                public void setFavoriteFoods(String[] favoriteFoods) {
                         
                         
                    this.favoriteFoods = favoriteFoods;
                }
            }
            
          • <?xml version="1.0" encoding="UTF-8"?>
            <beans xmlns="http://www.springframework.org/schema/beans"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            
                <bean id="personBean" class="com.powernode.spring6.bean.Person">
                    <property name="favoriteFoods">
                        <array>
                            <value>鸡排</value>
                            <value>汉堡</value>
                            <value>鹅肝</value>
                        </array>
                    </property>
                </bean>
            </beans>
            
      • 数组元素非简单类型

        • package com.powernode.spring6.bean;
          
          
          public class Goods {
                     
                     
          
              private String name;
          
              @Override
              public String toString() {
                     
                     
                  return "Goods{" +
                          "name='" + name + '\'' +
                          '}';
              }
          
              public String getName() {
                     
                     
                  return name;
              }
          
              public void setName(String name) {
                     
                     
                  this.name = name;
              }
          
              public Goods(String name) {
                     
                     
                  this.name = name;
              }
          
              public Goods() {
                     
                     
              }
          }
          
        • package com.powernode.spring6.bean;
          
          import java.util.Arrays;
          
          public class Order {
                     
                     
              // 一个订单中有多个商品
              private Goods[] goods;
          
              @Override
              public String toString() {
                     
                     
                  return "Order{" +
                          "goods=" + Arrays.toString(goods) +
                          '}';
              }
          
              public void setGoods(Goods[] goods) {
                     
                     
                  this.goods = goods;
              }
          
              public Order() {
                     
                     
              }
          
              public Order(Goods[] goods) {
                     
                     
                  this.goods = goods;
              }
          }
          
        • <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
          
              <bean id="goodsBean1" class="com.powernode.spring6.bean.Goods">
                  <property name="name" value="香蕉"/>
              </bean>
              <bean id="goodsBean2" class="com.powernode.spring6.bean.Goods">
                  <property name="name" value="葡萄"/>
              </bean>
              <bean id="orderBean" class="com.powernode.spring6.bean.Order">
                  <property name="goods">
                      <array>
                          <!--这里使用ref标签即可-->
                          <ref bean="goodsBean1" />
                          <ref bean="goodsBean2" />
                      </array>
                  </property>
              </bean>
          </beans>
          
      • 要点:

        • 元素是简单类型,使用value标签
        • 元素非简单类型,使用ref标签
    • 注入List集合

      • list集合:有序可重复

      • package com.powernode.spring6.bean;
        
        import java.util.List;
        
        public class People {
                 
                 
            // 一个人有多个名字
            private List<String> names;
        
            @Override
            public String toString() {
                 
                 
                return "People{" +
                        "names=" + names +
                        '}';
            }
        
            public void setNames(List<String> names) {
                 
                 
                this.names = names;
            }
        }
        
      • <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
            <bean id="peopleBean" class="com.powernode.spring6.bean.People">
                <property name="names">
                    <!--list集合有序可重复-->
                    <list>
                        <value>铁锤</value>
                        <value>张三</value>
                        <value>张三</value>
                        <value>张三</value>
                        <value>狼</value>
                    </list>
                </property>
            </bean>
        </beans>
        
      • 注意:注入List集合的时候使用list标签,如果List集合中是简单类型使用value标签,反之使用ref标签。

    • 注入Set集合
      • Set集合:无序不可重复

      • package com.powernode.spring6.bean;
        
        import java.util.List;
        import java.util.Set;
        
        /**
        
         */
        public class People {
                 
                 
            // 一个人有多个名字
            private List<String> names;
            // 一个人有多个电话
            private Set<String> phones;
        
            @Override
            public String toString() {
                 
                 
                return "People{" +
                        "names=" + names +
                        ", phones=" + phones +
                        '}';
            }
        
            public void setPhones(Set<String> phones) {
                 
                 
                this.phones = phones;
            }
        
            public void setNames(List<String> names) {
                 
                 
                this.names = names;
            }
        }
        
      • <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
        
            <bean id="peopleBean" class="com.powernode.spring6.bean.People">
                <property name="names">
                    <!--list集合有序可重复-->
                    <list>
                        <value>铁锤</value>
                        <value>张三</value>
                        <value>张三</value>
                        <value>张三</value>
                        <value></value>
                    </list>
                </property>
                <property name</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值