Spring复习

x33g5p2x  于2022-01-04 转载在 Spring  
字(10.1k)|赞(0)|评价(0)|浏览(209)

Spring

1、Spring框架的引言

​ spring(春天),生于在2002年,由Rod Johnson创作。Spring框架是一个集众多设计模式于一身的开源的、轻量级的项目管理框架。致力于JAVAEE 轻量级解决方案。相对于原来学过的框架而言,spring框架和之前学习的 struts2 、 mybatis 框架有了本质的区别,不是替换原来的某个框架,而是对其进行整合管理。

​ 轻量级解决方案:提供一个以简单的、统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。

2、Spring框架的核心作用

​ Spring 框架用来 管理 [创建|使用|销毁] 项目中的组件,由于spring 框架可以帮我们生产项目中组件对象,因此也习惯称spring是一
个工厂|容器。

组件:项目中的service,dao,controller,都是项目中的组件

注意:spring框架通常不管理对实体类对象(entry)创建

3、spring第一个程序

1、引入依赖

<!--spring核心以及相关依赖-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>

2、创建组件

public interface UserDAO{
    void save(String name);
}
public class UserDAOImpl implements UserDAO{
    
    @Override
    public void save(String name){
        System.out.println("姓名:"+name);
    }
}

3、添加配置文件

配置文件名称: 任意名称 (默认 spring.xml)

配置文件位置: 本项目中resources目录下

<?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-3.2.xsd ">
    
    <!-- 通过spring管理组件 bean: 用来管理组件对象的创建 class: 用来指定管理组件对象的全限定名 包.类 id: 用来指定spring框架创建的当前组件对象在spring(容器|工厂)中唯一标识 全局唯一 -->
    <bean class="init.UserDAOImpl" id="aa"></bean>
</beans>

4、启动工厂测试

public class TestSpring{
    public static void main(String[] args) {
        //启动工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        
        //获取工厂中创建好的对象 参数:获取工厂中指定对应的唯一标识
        UserDAO userDAO = (UserDAO) context.getBean("aa");

        userDAO.save("小黑");
    }
}

4、Spring框架中的核心思想

4.1、IOC

Inversion of Controll 控制反转

将对象的创建由原来(new)的方式转移到配置文件中,交给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-3.2.xsd ">

    <bean class="init.UserDAOImpl" id="aa"></bean>
    
    <bean class="init.CityDAOImpl" id="cityDAO"></bean>
</beans>
public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

    UserDAO userDAO = (UserDAO) context.getBean("aa");
    userDAO.save("小黑");

    CityDAO cityDAO = (CityDAO) context.getBean("aa");
    ciryDAO.delete("1");
}

当bean对象多了之后,ioc的好处变体现出来了

问题来了:我们可以把service对象也通过bean管理,但是在service中需要调用dao层对象,怎么办呢???

**DI(dependcy Injection)**依赖注入

定义: 为组件中成员变量完成赋值过程 这个过程称之为 依赖注入

public interface DeptService{
    void save(String name);
}

public class DeptServiceImpl implements DeptService{
    
    // 需要的组件
    private DeptDAO deptDAO;
    
    public void setDeptDAO(DeptDAO deptDAO){
        this.deptDAO=deptDAO;
    }
     
    @Override
    public void save(String name){
        System.out.println("deptService 姓名:"+name);
        deptDAO.save(name);
    }
}
<?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-3.2.xsd ">

    <!--管理DAO组件-->
    <bean class="init.DeptDAO" id="aa"></bean>
    
    <!--管理service组件-->
    <bean class="init.DeptServiceImpl" id="deptService">
    	<!--依赖注入 property: 用来给组件中的属性进行复制操作 name: 用来指定给组件中那个属性名惊醒赋值 ref: 用来指定赋值对象在工厂中唯一标识 bean的id -->
        <property name="deptDAO" ref="aa"/>
    </bean>
</beans>
public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    DeptService deptService = (DeptService) context.getBean("deptService");
    deptService.save("小黑");
}

**IOC 全部概述:**控制反转 就是通过原来手动通过new关键字创建对象的权力交给spring,由spring工厂创建对象的过程,当然spring不仅要创建对象还要在创建对象的同时通过DI的方式维护组件与组件的调用关系

spring中注入方式

  • set 注入 使用成员变量set方式形式进行赋值
  • 构造注入 使用构造方法形式进行属性的赋值
  • 自动注入 就是通过在配置文件中完成类中属性自动赋值

spring中set方式的注入语法

  • set注入: 使用类中的属性set方法为属性完成赋值的过程
  • set注入相关语法
public interface DeptService{
    void save(String name);
}

public class DeptServiceImpl implements DeptService{
    
    // 需要的组件
    private DeptDAO deptDAO;
    
    private String name;
    private Integer age;
    
    public void setName(String name){
        this.name=name;
    }
    public void setDeptDAO(DeptDAO deptDAO){
        this.deptDAO=deptDAO;
    }
     
    @Override
    public void save(String name){
        System.out.println("deptService 姓名:"+name);
        deptDAO.save(name);
        System.out.println("Name:"+ this.name);
    }
}
<?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-3.2.xsd ">

    <bean class="init.DeptDAO" id="aa"></bean>
    
    <bean class="init.DeptServiceImpl" id="deptService">
        <!--set注入相关语法, 八种基本类型 + String 类型注入使用+Date类型 value属性进行赋值-->
        <property name="deptDAO" ref="aa"/>
        <property name="name" value="小陈123"/>
        <property name="age" value="23"/>
        <!--注意:在spring中日期格式默认为yyyy/MM/dd HH:mm:ss-->
        <property name="bir" value="2121/12/12"/>
       <!--注入数组类型-->
        <property name="qqs">
            <array>
                <value>小陈</value>
                <value>大</value>
            </array>
        </property>
        <property name="clazzDAOS">
            <array>
                <ref bean="clazzDAO"/>
                <ref bean="clazzDAO"/>
            </array>
        </property>
        <!-- 注入list、set、map-->
        <property name="habby">
            <list>
                <value>看书</value>
                <value>睡觉</value>
                <value>打游戏</value>
            </list>
        </property>
        <property name="map">
            <map>
                <!-- 基本类型-->
                <entry key="" value=""></entry>
                <!-- 引用类型-->
                <entry key-ref="" value-ref=""></entry>
            </map>
        </property>
        <!-- 注入properties-->
        <property name="propertis">
            <props>
                <prop key="driver">com.mysql.jdbc.Driver</prop>
                <prop key="url">jdbc:mysql://localhost:3306/test</prop>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>
</beans>

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-3.2.xsd ">

    <!-- 管理DAO组件 1. set方式注入 注入时使用property标签 2. 构造方法注入 注入时使用constructor-arg标签 -->
    <bean class="cdi.EmpDAOImpl" id="empDAO">
        <!--使用构造注入-->
        <constructor-arg index="0" name="name" value="小黑"/>
        <constructor-arg index="1" name="age" value="23"/>
        <constructor-arg index="2" name="userDao" ref=""/>
        <!-- 注入数组-->
        <constructor-arg>
            <array>
                <value></value>
                <value></value>
                <value></value>
            </array>
        </constructor-arg>
        <constructor-arg>
            <list>
                <value></value>
                <value></value>
                <value></value>
            </list>
        </constructor-arg>
    </bean>
</beans>

缺点:需要有对应的构造方法

spring中自动注入

在spring工厂配置文件中通过制定自动注入方式 开启组件属性的自动赋值

注意:

  1. 底层使用原理也是set方式注入
  2. 自动注入需要在对应组件标签开启才能使用
  3. 只用于引用类型的注入|对应类型|组件类型的注入

自动注入语法

  1. 需要谁将谁声明为成员变量,并提供set方法
  2. 在对应组件标签汇总加入autowired 属性并制定自动注入方式即可完成注入
<?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-3.2.xsd ">

    <bean class="adi.StudentADOImpl" id="studentDAO"></bean>

    <!-- 管理service组件 autowire: 用来给组件中成员变量完成自动赋值操作 byType: 根据类型完成自动注入 根据成员变量类型去工厂找 找到对应类型完成赋值 注意:如果工厂中存在多个类型一致的组件,使用类型自动注入会报错 byName: 根据名称完成自动注入 根据成员变量名去工厂中获取与之一致名字,找到对应的赋值 -->
    <bean class="adi.StudentADOImpl" id="studentService" autowire="byName"></bean>

</beans>

相关文章