Spring4入门(一)_hm

Spring4-2.4简介

Spring3.x(整合hibernate3.x)和Spring4.x

Spring:开源,SE/EE开发的一站式框架

一站式框架:有EE开发的每一层解决方案

  WEB层            :SpringMVC

    Service层         :Spring的Bean管理,Spring声明式事务

    DAO层             :Spring的Jdbc模板,Spring的ORM模块(整合Hibernate)

搭建Spring开发环境:Spring入门(IOC)

IOC:将对象的创建权反转给Spring

控制反转(Inversion of Control,缩写为IoC),是面向对象中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

step1:Spring开发下载jar包

1、spring-framework-3.0.2.RELEASE-dependencies.zip:依赖库

2、spring-framework-4.2.4.RELEASE-dist.zip:完整jar包

将spring-framework-4.2.4.RELEASE-dist.zip解压后的目录结构

1、docs           :Spring的开发规范和API

2、libs             :Spring的开发的jar和源码

3、schema      :Spring的配置文件的约束

step2:IOC的开发需要引入的jar包

方式一:复制jar包到项目

核心容器

1、spring-beans-4.2.4.RELEASE.jar

2、spring-context-4.2.4.RELEASE.jar

3、spring-core-4.2.4.RELEASE.jar

4、spring-expression-4.2.4.RELEASE.jar

关于日志的包

5、com.springsource.org.apache.commons.logging-1.1.1.jar:日志记录接口规范

6、com.springsource.org.apache.log4j-1.2.15.jar

方式二:Maven的pom.xml配置

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>

step3:创建接口和类

接口

package com.spring.demo;

public interface UserDAO {
    public void save() ;
}
View Code

类

package com.spring.demo;

public class UserDAOImpl implements UserDAO {

    @Override
    public void save() {
        System.out.println("UserDAO的实现类..........");
    }

}
View Code

PS:Spring底层实现是工厂设计模式+反射+配置文件实现程序解耦合

step4:配置文件applicationContext.xml

在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html页面的底部有参照

<?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">
    <!-- Spring的入门配置 -->
    <bean id="userDAO" class="com.spring.demo.UserDAOImpl"></bean>

</beans>

Spring默认的配置文件名applicationContext.xml

step5:编写测试类

    public void demo() {
        //创建Spring的工厂
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
        //getBean中的参数对应配置文件中id属性值
        UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO") ;
        userDAO.save();
    }

IOC和DI的关系

IOC:控制反转,将对象的创建权反转给了Spring

DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来

面向对象的对象间关系

1、依赖:例如:

Class A{}

Class B{
    public void xxx(A a){
        //这个方法的参数需要A类的实例,成为依赖
        }
}

2、继承

3、聚合

DI的示例:在Spring创建实例对象的过程中,为该对象的属性赋值,称为DI

1、在UserDAOImpl.java中添加name属性和setName方法

package com.spring.demo;

public class UserDAOImpl implements UserDAO {
    
    private String name ;
    
    public void setName(String name) {
        this.name = name ;
    }
    
    @Override
    public void save() {
        System.out.println("UserDAO的实现类.........." + name);
    }

}
View Code

2、applicationContext.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">
    <!-- Spring的入门配置 -->
    <bean id="userDAO" class="com.spring.demo.UserDAOImpl">
        <property name="name" value="DI赋值name属性"></property>
    </bean>

</beans>
View Code

Spring工厂类

继承结构

 

PS:ApplicationContext继承BeanFactory

BeanFactory:老版本的工厂类

1、BeanFactory:调用getBean的时候,才会生成类的实例

2、两种工厂类的使用方式是一样的

ApplicationContext  :新版本的工厂类

1、加载配置文件的时候,就会将Spring管理的类都实例化。(是否是单例?)

2、有两个实现类:

ClassPathXmlApplicationContext :加载类路径下的配置文件(一般将配置文件放在项目下,故一般使用这个类)

FileSystemXmlApplicationContext :加载文件系统下的配置文件(硬件磁盘,盘符开头)

XML提示配置

Bean的配置

bean标签的id和name

1、id:使用了约束中的唯一约束。里面不能出现特殊字符的。

2、name       :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。(Spring和Struts1框架整合的时候必须使用name,使用时的参照<bean name=”/user” class=””/>)

Bean生命周期的配置

这个配置不是那么重要(了解)

1、init-method               :Bean被初始化的时候执行的方法

2、destroy-method       :Bean被销毁的时候执行的方法(前提Bean是单例创建,默认Bean是单例创建,工厂关闭)

 PS:当ClassPathXmlApplicationContext加载类路径下的配置文件,就会创建Bean的对象,使用ClassPathXmlApplicationContext对象的close方法将会销毁Bean的对象

配置文件applicationContext.xml

<bean id="userDao" class="com.itheima.dao.impl.UserDao" init-method="init" destroy-method="destroy"></bean>

UserDao.java

public class UserDao implements IUserDao {
    @Override
    public void addUser(User user) {
        System.out.println("执行addUser方法.........");
    }

    public void init(){
        System.out.println("执行init方法.....");
    }

    public void destroy(){
        System.out.println("执行destroy方法.....");
    }

}

测试代码 

    @Test
    public void test04(){
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
        UserDao userDao = applicationContext.getBean("userDao", UserDao.class);
        userDao.addUser(new User());
        applicationContext.close();
    }

Bean的作用范围的配置(**)

scope 属性配置Bean的作用范围,取值范围:

在实际开发中,常用的就是前面的两个

1、singleton         :默认的,Spring会采用单例模式创建这个对象。

2、prototype       :多例模式。(Struts2和Spring整合一定会用到)

3、request             :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。

4、session             :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。

5、globalsession   :应用在web项目中,必须在porlet环境下使用(在一处登录,则在其子系统中不用再次登录,例如:在百度中登录,在百度网盘就不用再次登录)。但是如果没有这种环境,相对于session。

属性注入

Spring支持两类的方式:构造器的方式、为类的属性设置set方法(****)

1、构造方法的属性注入

创建类User.java

package com.spring.demo;

public class User {
    private String name ;
    private String password ;
    public User(String name, String password) {
        super();
        this.name = name;
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", password=" + password + "]";
    }
    
}
View Code

applicationContext.xml配置文件中的配置

    <!-- 构造方法的属性注入 -->
    <bean id="user" class="com.spring.demo.User">
        <constructor-arg name="name" value="javaweb"/>
        <constructor-arg name="password" value="123"/>
    </bean>

测试代码

    @Test
    public void demo() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
        User user = (User) applicationContext.getBean("user") ;
        System.out.println(user);
    }
View Code

2、set方法方式的属性注入

step1:创建类

Car.java(Javabean)

package com.spring.demo;

public class Car {
    private String name ;
    private double price ;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Car [name=" + name + ", price=" + price + "]";
    }
    
}
View Code

Employee.java(javabean)

package com.spring.demo;

public class Employee {
    private String username ;
    private Car car ;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    @Override
    public String toString() {
        return "Employee [username=" + username + ", car=" + car + "]";
    }
    
}
View Code

step2:配置文件

    <!-- set方法的方式 -->
    <bean id="car" class="com.spring.demo.Car">
        <property name="name" value="奥迪"/>
        <property name="price" value="300000"></property>
    </bean>
    <!-- set方法注入引用对象类型的属性 -->
    <bean id="employee" class="com.spring.demo.Employee">
        <!-- value:设置普通类型的值,ref:设置其他的类id或name,例如上面设置了的id为car -->
        <property name="username" value="张三"/>
        <property name="car" ref="car"></property>
    </bean>
View Code

step3:测试代码

    public void demo() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
        Employee employee = (Employee) applicationContext.getBean("employee") ;
        System.out.println(employee);
    }
View Code

PS:构造方法的属性注入方式要注入的是引用类型,和这种方式配置类似

3、P名称空间的属性注入(Spring2.5以后)

通过引入p名称空间完成属性的注入:格式如下

普通属性        p:属性名=”值”

对象属性        p:属性名-ref=”值”

step1:p名称空间的引入

 step2:使用p名称空间

    <!-- 改为p名称空间的方式 -->
    <bean id="car" class="com.spring.demo.Car" p:name="路虎" p:price="300000"></bean>
    <bean id="employee" class="com.spring.demo.Employee" p:name="张三" p:car-ref="car"></bean>

SpEL的属性注入(Spring3.0以后)

SpEL:Spring Expression Language,Spring的表达式语言,语法格式: #{SpEL}

部分配置示例:参考Spring表达式手册

    <!-- SpEL的属性注入 -->
    <bean id="carInfo" class="com.spring.demo.CarInfo">
    </bean>
    
    <bean id="car" class="com.spring.demo.Car">
        <property name="name" value="#{carInfo.name}"></property>
        <property name="price" value="#{carInfo.calculatorPrice()}"></property>
    </bean>
    
    <bean id="employee" class="com.spring.demo.Employee">
        <property name="name" value="#{'张三'}"></property>
        <property name="car" value="#{car}"></property>
    </bean>
View Code

 CarInfo.java

public class CarInfo {
    private String name;
    
    public String getName() {
        return "摩托车";
    }
    
    public Double calculatorPrice(){
        return Math.random() * 3000;
    }
}
View Code

集合类型属性注入(了解)

step1:在类中设置相应类型的属性,并提供set方法

step2:配置文件applicationContext.xml配置

    <!-- Spring的集合属性的注入============================ -->
    <!-- 注入数组类型 -->
    <bean id="collectionBean" class="com.spring.demo.CollectionBean">
        <!-- 数组类型 -->
        <property name="arrs">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </list>
        </property>
        
        <!-- 注入list集合 -->
        <property name="list">
            <list>
                <value>赵六</value>
                <value>王霸</value>
                <value>李九</value>
            </list>
        </property>
        
        <!-- 注入set集合 -->
        <property name="set">
            <set>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </set>
        </property>
        
        <!-- 注入Map集合 -->
        <property name="map">
            <map>
                <entry key="aaa" value="111"/>
                <entry key="bbb" value="222"/>
                <entry key="ccc" value="333"/>
            </map>
        </property>
    </bean>
View Code

Spring分模块开发配置

1、在加载配置文件的时候,加载多个 ,利用ClassPathXmlApplicationContext 

        //创建Spring的工厂时,加载多个配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml") ;

 

2、在一个配置文件中引入多个配置文件

引入src下的配置文件,如果在包中需要添加相应的路径

    <import resource="applicationContext.xml"/>

Spring整合WEB项目

 

 

 

zwy

posted @ 2019-02-24 13:06  zwyk  阅读(145)  评论(0)    收藏  举报