• spring-第一章-基本用法


    一,简介

    spring是一个开源框架

    是一个非常强大的容器框架,分离项目组件之间的依赖关系,由spring容器管理整个项目的资源和配置;

    通常我们可以称spring是容器大管家(项目大管家)

    功能:

      (1)  控制反转(IOC)

      (2)AOP变成的支持

      (3)事务的事务

      (4)依赖注入(DI)

      (5)对其他web框架的支持(struts2,hibernate.......)

    二,控制反转(IOC)

    IOC:inversion of control

      spring的核心,对于spring框架来说,就是由spring来控制对象的生命周期和对象间的关系;

      所有的类都会在spring容器中登记,告诉spring你是一个什么东西,你需要什么东西,然后spring 在系统运行到合适的时候,把你需要的东西主动给你,同时也把你提供给需要你的东西;

    所有类的创建,销毁都由spring来控制,也就是说控制对象的生命周期不再是由引用它的对象,而是spring;

      对于某个具体的对象而言,以前是他控制器他对象,而现在是所有的对象都被spring控制,所以称之为控制反转;

    三,依赖注入(DI)

      IOC的一个重点是系统在运行时,动态的向某个对象提供它所需要的其他对象,这点是通过DI(Dependency Injectioin ,依赖注入)来实现的;

      比如对象A需要操作数据库,以前我们可能就是在A中自己编写代码提供一个Connection对象,有了spring之后,我们只需要告诉spring,A需要一个Connection对象,

    至于这个Connection对象到底如何来的,A需要知道;在系统运行到某个时候,spring就会给A提供Connection对象,像打针一样,把Connection对象注入到A中,依赖注入的名称

    就是这样来的;

      那么DI底层实现是通过什么技术?反射

    四,IOC和DI

      IOC是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机由我们自己把控,而现在这种权利转移给spring框架

      DI其实是IOC的另一种说法,控制的什么被反转了?就是获取对象的方式被反转了

      IOC设计模式,DI是IOC设计模式的一种实现;(ORM hibernate)

    五,下载

    https://repo.spring.io/libs-release-local/org/springframework/spring/

    六、spring入门

    1、jar包

     

    需要额外导入lombok.jar

    2、User类

    @Data
    public class User {
        private String name;
        private int age;
    }

    3、src新建beans.xml

    <?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">
    
            
    </beans>

    4、在beans.xml中配置bean实例

    <!-- 声明bean实例,相当于是一个对象,id:唯一标识,class:类全名 -->
        <bean id="user1" class="com.yujun.po.User">
            <!-- 类中的属性    name:属性名    value:属性值 -->
            <property name="name" value="小明"></property>
            <property name="age" value="20"></property>
        </bean>

    5、测试

    public class Demo1 {
    
        public static void main(String[] args) {
            //通过beans.xml配置文件,创建应用上下文对象,可以当做是spring容器
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
            //通过配置文件中bean的id得到bean对象
            User user1 =  (User) context.getBean("user1");
            System.out.println(user1);
        }
    
    }

    使用上述代码运行,会抛出下面截图中异常,原因是缺少一个commons-logging-xx.jar

    请自行在项目中导入commons-logging-xx.jar

    如果使用maven构建项目,请添加下面的依赖

    <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.1.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.2</version>
                <scope>provided</scope>
            </dependency>

    6、构造方法赋值

    (1)需要给User中提供一个带参数的构造方法

    public User(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }

    也是用使用lombok中的@AllargsControctor也可以

    (2)在beans.xml中配置

    <bean id="user2" class="com.yujun.maven.po.User">
            <!-- 通过构造方法给属性赋值    index:构造方法中参数的下标    value:参数值 -->
            <constructor-arg index="0" value="小红"></constructor-arg>
            <constructor-arg index="1" value="21"></constructor-arg>
    </bean>

    七、依赖注入案例

    我们这里以员工和部门为例,员工属于某个部门,在spring中,怎么把某个部分注入给员工?

    1、实体类

    @Data
    public class Dept {
        private int id;
        private String name; 
    }
    @Data
    public class Emp {
        private int id;
        private String name;
        private Dept dept;
    }

    2、beans.xml

    <bean id="dept1" class="com.yujun.maven.po.Dept">
            <property name="id" value="1"></property>
            <property name="name" value="开发部"></property>
        </bean>
        
        <bean id="emp1" class="com.yujun.maven.po.Emp">
            <property name="id" value="100"></property>
            <property name="name" value="小黑"></property>
            <!-- ref:表示引用spring容器中存在bean的id,也就是依赖注入 -->
            <property name="dept" ref="dept1"></property>
        </bean>

    3、测试

    Emp emp1 = (Emp) context.getBean("emp1");
    System.out.println(emp1);

    八、注入方式

    在刚才我们使用ref属性,指定bean的id,这种方式就是默认的,当让也是常用,也是推荐的一种方式;

             下面我们介绍其他的注入方式;

    1、autowire=”default”

    此方式就是默认的配置,也是推荐大家使用的方式;也就是需要我们在bean的property节点中通过ref属性来指定依赖的bean的id

    2、autowire=”byName”

             此方式通过名称注入,必须让bean的id和类中属性名一样

     

    3、autowire=”byType”

             此方式通过类型注入,和依赖的bean的id没有关系,但是需要保证类型的bean在spring容器中只有一个,否则抛异常

     

    4、小结

    注入方式,通常默认配置,需要我们手动使用ref属性指定bean的id

    九、bean的作用域

             bean被spring容器管理后,可以通过scope属性来指定作用域,也就是bean的作用的范围;

             通常取值:singletion、prototype、request、session,我们主要介绍前两个

    1、scope=”singletion”

    这是默认值,表示单例,也就是bean在spring容器中只有一个对象实例

     

    2、scope=”prototype”

    此方式表示多例,bean在spring容器中会产生N个对象实例

     

    在后面讲解spring+struts2时,需要把struts2的action的此属性设置多例

    十、注入集合数据

    1、实体类

    @Data
    public class ListBean {
        private List<String> list;
        private Set<String> set;
        private Map<String,Integer> map;
    }

    2、beans.xml

    <bean id="list1" class="com.yujun.maven.po.ListBean">
            <property name="list">
                <list>
                    <value>小明</value>
                    <value>小红</value>
                    <value>小黑</value>
                </list>
            </property>
            
            <property name="set">
                <set>
                    <value>aaa</value>
                    <value>bbb</value>
                    <value>ccc</value>
                </set>
            </property>
            
            <property name="map">
                <map>
                    <entry key="a1" value="10"></entry>
                    <entry key="a2" value="20"></entry>
                </map>
            </property>
    </bean>

    3、测试

    ListBean list = (ListBean) context.getBean("list1");
    System.out.println(list);

    十一、其他配置

    在bean标签中添加设置下列属性

    1、lazy-init=”true”

    配置当前bean是否懒加载,默认是false

    2、init-method=”方法名”

    bean被实例化后执行的初始化方法

    3、destroy-method=”方法名”

    bean被销毁后执行的销毁方法

  • 相关阅读:
    看美剧学英语 | Jeff Winger's speech in Community
    学习笔记 | Coursera
    学习笔记 | Coursera
    Python: How to reverse a list in python
    公司接口流程
    使用Supervisor管理Django应用进程
    orm中 如何模糊匹配某一年的用户和某一事时间段的用户
    Linux如何查看进程是否存活
    项目中有 xxxx 不能被json序列化
    关于项目经验
  • 原文地址:https://www.cnblogs.com/faded8679/p/10786176.html
Copyright © 2020-2023  润新知