spring概述

Spring是一个非常活跃的开源框架,为了解决企业应用开发的复杂性而创建。

目前,Spring框架包含的功能大约由20个模块组成。这些模块按组可分为核心容器、数据访问/集成,Web,AOP(面向切面编程)、设备、消息和测试

但总的来说,Spring最核心的还是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架;它基于以上两点来构架多层JavaEE系统,以帮助分离项目组件之间的依赖关系、

IOC / DI 概述

IOC 概述: (Inversion of Control) 控制反转

理解控制正转,即控制权掌握在自己手中

控制权掌握在手中:负责整个对象的创建 [掌握对象的任何细节] 。即 把对象 new 出来

好处: 掌握对象的所有细节,对对象拥有控制权和维护权

坏处:耦合性太高,浪费太多的时间和精力在对象的维护上,不利于开展自己核心业务

案例: 假设你去旅行,需要依赖各种交通工具。 请问,你会在旅行的过程中,不断的自己去创建交通工具吗?  

IOC的定义和方式

IOC定义:指把创建对象的权利[new 类名()]反转给 容器

这样的好处:降低耦合 利于专注于自己的核心业务

实现方式:将所有需要new的对象都配置到容器中,通过读取容器的配置文件 ,利用反射技术new出来

spring IOC快速入门

1.下载/ 导入 spring jar包

 

主要jar说明: 4核心(beans、core、context,expression) + 1个依赖(common-logging.jar)

Pom.xml的依赖

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

 

 

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">

</beans>

3.编写简单的javaBean

public class Car {

    public void go(String address){

        System.out.println("启动引擎"+"去"+ address);

    }

}

4.将javaBean,注册到 容器的配置文件中

<bean id="car" class="com.springioc.basic.beans.Car"/>

5.编写测试类  IOC

public class TestBeans {

    public static void main(String[] args) {

        //1.读取容器配置文件,产生容器

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");

        //2.从容器中,获取该对象

        Car car = (Car) applicationContext.getBean("car");

        //3.用新产生的对象,执行方法

        car.go("杭州");

    }

}

4.spring加载容器的三种方式

类路径加载

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");

文件路径加载

ApplicationContext applicationContext = new FileSystemXmlApplicationContext("D:\\IdeaProjects\\springioc\\src\\main\\resources\\ApplicationContext.xml");

BeanFactory方式加载

String path = "D:\\IdeaProjects\\springioc\\src\\main\\resources\\ApplicationContext.xml";

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource(path));

 

BeanFactory和ApplicationContext对比

BeanFactory 采取延迟加载,第一次getBean时才会初始化Bean  

ApplicationContext 即时加载; 它是对BeanFactory扩展,提供了更多功能

启动web时候,ApplicationContext容器会自动初始化所有singleton Bean,在前期启动创建它的时候有较大系统开销,但后续程序获取singleton Bean实例时,将有较好性能

 

5.bean 的装配

bean的实例化[new] 三种方式

构造方法[无参]实例化

<!--方式一:采用 无参构造函数 -->

<bean id="baseCar" class="com.hzp.beans.Car" ></bean>

静态工厂实例化

public class CarStaticFactory {

    //静态工厂

    public static ICar createCar(){

 return new Car();

 }

}

普通工厂实例化

public class DaoFactory {

    //实例工厂

    public FactoryDao getFactoryDaoImpl(){

        return new FactoryDaoImpl();

    }

}

<!--方式三: 采用普通工厂 -->

<!-- 先有 daoFactory ,然后用 factory-bean 及  factory-method 说明调用方式 -->

<bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean>

<bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>  

 

6.bean属性的主要配置

属性列表

 

spring之IOC与DI学习简单笔记

Bean Scope作用域

spring之IOC与DI学习简单笔记

 

Bean的生命周期 【init-method    destroy-method】  

 初始化bean ===> 给bean打标签名(BeanNameAware) ===> 装载到beanFactory中(BeanFactoryAware) ==> 前期统一处理 ==> 属性关联===》调用初始化 Init-method  ==》后期统一处理 ==》 业务处理

容器关闭 ==》执行destroy ==》调用bean的  destroy-method 方法

bean的懒加载 init-lazy

默认false  不进行懒加载

 

spring 依赖注入(DI)

DI (Dependency Injection 依赖注入) 

什么是依赖:当一个类执行方法人==》 旅行(),处理核心业务时,需要借助其他类(汽车 飞机)来完成,那么,就说 这个类依赖其他类

控制反转IOC,是一种思想方案,即将new的过程,反向交由容器管理,以减少对象生成及维护细节的探讨。而DI是IOC最好的实现方案,即:类和类之间有依赖关系时,对依赖的类采取注入的方式实现是最佳实践。

所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦.

spring依赖注入方式

属性setter注入

普通属性注入   整数、布尔、 字符串

spring之IOC与DI学习简单笔记

 

对象属性注入

spring之IOC与DI学习简单笔记

 

集合属性注入

 

spring之IOC与DI学习简单笔记

p命名空间注入【了解】

<!-- 需要在 beans的配置文件上添加 p标签支持 xmlns:p="http://www.springframework.org/schema/p"-->

<bean id="userService" class="com.hzp.spring.service.UserService" />

<bean id="userAction" class="com.hzp.spring.action.UserController"

 p:username="用户名" p:userService-ref="userService" />

 

spEL表达式注入【了解】

<property>进行统一编程,所有的内容都使用value

<property name="" value="#{表达式}">

#{123}、#{'jack'} : 数字、字符串

#{beanId} :另一个bean引用

#{beanId.propName} :操作数据

#{beanId.toString()} :执行方法

#{T(类).字段|方法} :静态方法或字段

 

spring之IOC与DI学习简单笔记

 

读取外部配置文件的方式

                       spring之IOC与DI学习简单笔记

用法

<property name="driverClassName" value="${jdbc.username}"></property>

<property name="password" value="${jdbc.password}"></property>

<property name="url" value="${jdbc.url}"/>

 

自动装配【重点】:

<bean  autowired=”byName”>

  1. 按名称对应 装配 ;要求:名称必须一一对应   

<bean  autowired=”byType”>

  1. 按接口对应的类型进行装配; 对名字没有要求;但是,不能有多个实现类;

构造注入【重点】

构造一个参数

构造函数多个参数

<!-- 顺序匹配 -->

<bean id="person" class="com.hzqf.start.Person" >
    <constructor-arg value="20" ></constructor-arg>
</bean>

 

<!-- 参数类型匹配 -->

<bean id="person2" class="com.hzqf.start.Person">
    <constructor-arg type="java.lang.Integer" value="30"/>
    <constructor-arg type="com.hzqf.start.beans.Car" ref="car" />
</bean>

 

<!-- 索引匹配 -->

<bean id="person3" class="com.hzqf.start.Person">
    <constructor-arg index="0" value="30"/>
    <constructor-arg index="1" value="李四"/>
    <constructor-arg index="2" ref="car"/>
</bean>

 

<!-- 混合匹配 -->

<bean id="person4" class="com.hzqf.start.Person">
    <constructor-arg index="0" type="java.lang.Integer" name="age" value="30"/>
    <constructor-arg index="1" type="java.lang.String" name="name" value="李四"/>
    <constructor-arg index="2" ref="car"/>
</bean>

 

注解的形式

自动装配 @Autowired 和 @Resource

spring之IOC与DI学习简单笔记

 

<!-- 采用包扫描一下-->
<context:component-scan base-package="com.hzqf.start.web" />

在对应的类上 标注注解

spring之IOC与DI学习简单笔记

 

Web开发常用注解

 

@Component  【组件】

@Controller   【控制】

@Service    【服务】

@Repository  【仓库】

 其他注解

属性赋值 @Value

作用域@Scope("prototype")

生命周期 @PostConstruct @PreDestroy

 

Spring 整合JUnit单元测试

导入jar包

 <dependency>

     <groupId>junit</groupId>

     <artifactId>junit</artifactId>

     <version>4.12</version>

</dependency>

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-test</artifactId>

    <version>${spring.version}</version>

</dependency>

创建测试类

//创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定创建容器时使用哪个配置文件
@ContextConfiguration("classpath:Annotation.xml")
public class SpringTest {
    @Autowired
    private UserController userController;

    @Test
    public void testController()
    {
        userController.initSuccess();
    }
}

相关文章: