Spring ①

1.Spring

1.1简介

  • Spring:给软件行业带来了春天
  • 历史:2002年首次推出了Spring框架的雏形
  • 2004年3月24日,Rod Johnson创始人,音乐学博士
  • Spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术
  • SSH:Struct2+Spting+Hibernate
  • SSM:SpringMvc+Spring+Mybatis

官网:Spring Framework

GitHub:GitHub - spring-projects/spring-framework: Spring Framework

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

1.2优点

  • spring是一个开元的免费的框架!
  • 是一个轻量级非入侵式的框架!
  • 控制反转(IOC),面向切面编程(AOP)
  • 支持事物的处理,对框架整合的支持!

总结一句话:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!

1.3Spring的组成

1.4

Spring开发的流程

  • Spring-boot是一个快速开发的脚手架
  • 基于Spring-boot可以快速的开发单个微服务
  • Spring-boot约定大于配置
  • Spring-cloud是基于Spring-boot实现的;

Spring-boot弊端:发展过久,违背了以前的理念,配置十分繁琐,人称配置地狱

2.IOC理论推导

  • 以前:
    • UserDao接口
    • UserDaoImpl实现类
    • UserService业务接口
    • UserSerivceImpl业务实现类

在我们之前的业务中,用户的需求可额能会影响我们原来的代码,我们需要根据需求修改原来的代码

如果程序代码量十分大,修改一次的代价十分昂贵;But

我们通过set注入接口实现,已经发生了革命性的变化

private UserDao userDao;

    //利用set进行动态实现值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void getUser(){
        userDao.getUser();
    }
  • 之前是程序主动创建对象,控制权在程序员手上
  • 然使用set注入后,程序不在具有主动性,而是变成了被动的接受对象

这种思想从本质上解决了问题,我们程序员不用再管理对象的创建了,系统的耦合性大大降低,

可以专注在业务拓展与实现!这是IOC的原型!将主动权交给用户。

DI依赖注入是IOC的一种方法;

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(Dependency Iniection,Dl)。

3.HELLOSPRING

public class MyTest {
    public static void main(String[] args) {
        //获取Spring的上下文对象!从你的配置文件beans中读取方法
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        //我们的对象现在都在Spring中管理了,我们要使用直接取出来就可以了
        Hello hello = (Hello) context.getBean("hello");
        
        System.out.println(hello.toString());

    }
}

思考问题

  • Hello对象是谁创建的
    • 由Spring创建的
  • Hello对象的属性是 怎么设置的
    • Hello对象的属性是由Spring容器设置的

这个过程叫控制反转;

  • 控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的.

  • 反转∶程序本身不创建对象,而变成被动的接收对象.依赖注入︰就是利用set方法来进行注入的.

OC是一种编程思想,由主动的编程变成被动的接收.

  • 可以通过newClassPathXmlApplicationContext去浏览一下底层源码.

  • OK,到了现在,我们彻底不用再程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的loC,一句话搞定:对象由Spring来创建,管理,装配!

4.IOC创建对象

  1. 使用无参构造创建对象,默认的

  2. 如果使用有参,有三种方法

    1. 下标赋值

      <bean id="user" class="com.zhou.pojo.User">
              <constructor-arg index="0" value="zhou_jx"/>
      </bean>
      
    2. 通过数据类型

      <bean id="user" class="com.zhou.pojo.User">
              <constructor-arg type="java.lang.String" value="zhou9527"/>
      </bean>
      
    3. 直接通过参数名

      <bean id="user" class="com.zhou.pojo.User">
              <constructor-arg name="name" value="zhoujiaxiong"/>
      </bean>
      

    总结:在配置文件加载的时候,容器就已经将bean里面的对象初始化了;

Spring

5.1alias别名

<!--添加别名,原来的名字,和别名都可以使用-->
    <alias name="user" alias="zhoubatian"/>

5.2 bean的配置

<!--
    id:bean的标识符,调用的时候,就是调用这个id
    class:bean对象所对应的全限定名(报名加类型)
    name:也算是别名的一种,而且比alias更高级,可以取多个
    -->
    <bean id="userT" class="com.zhou.pojo.UserT" name="userT2,1,2">
        <property name="name" value="beans的配置"/>
    </bean>

5.3import

通过import来管理不同的beans.xml配置文件,适用于团队开发

<import resource="beans.xml"/>
    <import resource="beans2.xml"/>
    <import resource="beans3.xml"/>

6.DI依赖注入

6.1构造器注入(前面说过了)

6.2Set方法注入【重点】

  • 依赖注入:Set注入!
    • 依赖:bean对象的创建依赖于容器
    • 注入:bean对象中的所有属性,通过容器注入

【环境搭建】

  1. 复杂类型

    public class Address {
        private String address;
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    
  2. 真实测试对象

    public class Student {
    
        private String name;
        private Address address;
        private String[] books;
        private List<String> hobby;
        private Map<String,String> card;
        private Set<String> games;
        private String wife;
        private Properties info;
    
  3. 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
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="student" class="com.zhou.pojo.Student">
            <!--第一种,普通值注入 value-->
            <property name="name" value="zhou_jx"/>
        </bean>
    
    </beans>
    
  4. 测试类

    public class MyTest {
        public static void main(String[] args) {
            //获取beans容器
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    
    
            Student student = (Student) context.getBean("student");
    
            System.out.println(student.getName());
        }
    }
    
  5. 完善注入信息

    <?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
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--第二种引用的bean需要注册一下-->
        <bean id="address" class="com.zhou.pojo.Address"/>
    
        <bean id="student" class="com.zhou.pojo.Student">
            <!--第一种,普通值注入 value-->
            <property name="name" value="zhou_jx"/>
    
            <!--第二种,bean注入 ref-->
            <property name="address" ref="address"/>
    
            <!--数组注入 -->
            <property name="books">
                <array>
                    <value>红楼梦</value>
                    <value>西游记</value>
                    <value>水浒传</value>
                    <value>三国志</value>
                </array>
            </property>
    
            <!--list-->
            <property name="hobby">
                <list>
                    <value>下象棋</value>
                    <value>敲代码</value>
                    <value>看电影</value>
                </list>
            </property>
    
            <!--Map-->
            <property name="card">
                <map>
                    <entry key="身份证" value="432321199986451234"/>
                    <entry key="银行卡" value="13215648744"/>
                </map>
            </property>
    
            <!--set-->
            <property name="games">
                <set>
                    <value>LOL</value>
                    <value>COC</value>
                    <value>BOB</value>
                </set>
            </property>
    
            <!--null-->
            <property name="wife">
                <null>
    
                </null>
            </property>
    
            <!--property-->
            <property name="info">
                <props>
                    <prop key="driver">1816130709</prop>
                    <prop key="url">男性</prop>
                    <prop key="username">root</prop>
                    <prop key="password">123456</prop>
    
                </props>
            </property>
        </bean>
    
    </beans>
    
  6. 运行结果

    import com.zhou.pojo.Student;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * @author:Zhou_jx,
     */
    public class MyTest {
        public static void main(String[] args) {
            //获取beans容器
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    
    
            Student student = (Student) context.getBean("student");
    
            System.out.println(student.toString());
    /*
            Student{name='zhou_jx',
             address=Address{address='null'},
             books=[红楼梦, 西游记, 水浒传, 三国志],
              hobby=[下象棋, 敲代码, 看电影],
               card={身份证=432321199986451234, 银行卡=13215648744},
                games=[LOL, COC, BOB],
                 wife='null',
                 info={password=123456, url=男性, driver=1816130709, username=root}}
    */
    
        }
    }
    
    

6.3拓展方法注入

  • p标签

    xmlns:p="http://www.springframework.org/schema/p"
    
  • c标签

    <!--c命名空间注入,通过构造器注入,需要有参构造-->
        <bean id="user1" class="com.zhou.pojo.User" c:age="19"c:name="zhoubatian"/>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值