Spring概述

简介: Spring概述

spring的出现就是为了解耦合,充当一个管家的角色。


Spring把代码根据功能划分:


  1. 主业务逻辑代码
  1. 代码逻辑联系紧密,耦合度高,复用性低。
  2. 降低主业务代码之间的耦合度 =>> 控制反转 IOC
  1. 系统级业务逻辑(交叉业务逻辑)
  1. 功能相对独立,没有具体的业务场景,主要是提供系统级服务,如日志,安全,事务等,复用性很强。
  2. 降低主业务逻辑和系统级服务之间的耦合度 =>> 面向切面编程 AOP


image.png


一,控制反转 IOC Inversion of Control



是一种思想,一个概念

IOC实现的两种方式

1. 依赖注入 DI Dependency Injection

2. 依赖查找 DL Dependency Lookup


创建第一个Spring项目


新建Maven工程

POM文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.bjxl</groupId>
    <artifactId>spring4</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <kotlin.version>1.1.51</kotlin.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--相当于slf4j-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-jre8</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-test</artifactId>
            <version>${kotlin.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>${kotlin.version}</version>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <source>src/main/java</source>
                                <source>src/main/interface</source>
                            </sourceDirs>
                        </configuration>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <jvmTarget>1.8</jvmTarget>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ServiceImpl

package impl
import face.ISomeService
/**
 * Created by futao on 2017/9/29.
 */
class ISomeServiceImpl : ISomeService {
    override fun doFirst(): String {
        println("执行doFirst()方法")
        return "abcde"
    }
    override fun doSecond() {
        println("执行doSecond()方法")
    }
}

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">
    <!--bean容器-->
    <!--对象容器-->
    <!--注册Service对象,等于Java代码中 ISomeServiceImpl iss = new ISomeServiceImpl()
        这个对象是在Spring容器被初始化的时候Spring自动创建的
    -->
    <bean id="iss" class="impl.ISomeServiceImpl"/>
</beans>

测试

package ServiceTest
import impl.ISomeServiceImpl
import org.junit.Test
import org.springframework.context.ApplicationContext
import org.springframework.context.support.ClassPathXmlApplicationContext
/**
 * Created by futao on 2017/9/29.
 */
class myTest {
    /**
     * 传统方式 new对象
     */
    @Test
    fun test() {
        val iSomeServiceImpl = ISomeServiceImpl()
        iSomeServiceImpl.doFirst()
        iSomeServiceImpl.doSecond()
    }
     /**
     * 从bean容器里面获取
     */
    @Test
    fun test02() {
        //加载Spring配置文件,创建Spring对象,这个时候对象就已经全部被加载到Spring容器当中了
//        val container = ClassPathXmlApplicationContext("applicationContext.xml")
        val container = FileSystemXmlApplicationContext("D:\\eclipse-workspace\\spring4\\src\\main\\resources\\applicationContext.xml")
        //从容器中获取指定Bean对象
        val iss = container.getBean("iss") as ISomeServiceImpl
        iss.doSecond()
        iss.doFirst()
    }
}
}

bean的装配



动态工厂bean

package Factory
import impl.ISomeServiceImpl
/**
 * Created by futao on 2017/9/29.
 */
class dynamicFactory {
    fun getSomeService(): ISomeServiceImpl {
        return ISomeServiceImpl()
    }
}

<?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">
    <!--bean容器-->
    <!--对象容器-->
    <!--注册Service对象,等于Java代码中 ISomeServiceImpl iss = new ISomeServiceImpl()
        这个对象是在Spring容器被初始化的时候Spring自动创建的
    -->
    <!--<bean id="iss" class="impl.ISomeServiceImpl"/>-->
    <bean id="issFactory" class="Factory.dynamicFactory"/>
    <bean id="iss" factory-bean="issFactory" factory-method="getSomeService"/>
</beans>

静态工厂bean

....

容器中Bean的作用域


scope="prototype"   原型模式,每次都会创建一个新的对象(真正使用的时候才会被创建,每获取一次,都会创建一个新的不同的对象)

scope="singleton"    单例模式,对象只会被创建一次(容器初始化的时候就会进行创建,也就是xml文件加载的时候)(默认的)


Bean后处理器



实现BeanPostProcessor 接口


重写方法postProcessAfterInitialization()和postProcessAfterInitialization()

package beanHandler
import org.springframework.beans.factory.config.BeanPostProcessor
/**
 * Created by futao on 2017/9/29.
 */
class myBeanPostPrecess : BeanPostProcessor {
    //p0 当前调用执行'Bean后处理器'的Bean对象
    //p1 当前调用执行'Bean后处理器'的bean对象的id
    override fun postProcessBeforeInitialization(p0: Any?, p1: String?): Any {
        println("执行了${p0!!::class.java.simpleName},$p1,Before")
        return p0
    }
    override fun postProcessAfterInitialization(p0: Any?, p1: String?): Any {
        println("执行了${p0!!::class.java.simpleName},$p1,After")
        return p0
    }
}

测试

@Test
    fun test03() {
        val iss = ClassPathXmlApplicationContext("applicationContext.xml")
        val service = iss.getBean("iss") as ISomeServiceImpl
        service.doFirst()
        service.doSecond()
        println("================")
        val s2=iss.getBean("dyb") as ISomeServiceImpl
        s2.doSecond()
        s2.doFirst()
    }


结果


image.png

Bean的生命周期

package impl
import face.ISomeService
/**
 * Created by futao on 2017/9/29.
 */
class ISomeServiceImpl : ISomeService {
    override fun doFirst(): String {
        println("执行doFirst()方法")
        return "abcde"
    }
    override fun doSecond() {
        println("执行doSecond()方法")
    }
    fun initAtfer() {
        println("初始化之后")
    }
    fun beforeDestory() {
        println("销毁之前")
    }
}

XML

<bean id="iss" class="impl.ISomeServiceImpl" init-method="initAtfer" destroy-method="beforeDestory"/>

Test

@Test
    fun test03() {
        val iss = ClassPathXmlApplicationContext("applicationContext.xml")
        val service = iss.getBean("iss") as ISomeServiceImpl
        println(service.doFirst())
        service.doSecond()
        println("================")
        val s2=iss.getBean("dyb") as ISomeServiceImpl
        s2.doSecond()
        s2.doFirst()
    //销毁方法的执行需要两个要求
        /*
        *   1)被销毁的对象需要是singleton的
        *   2)容器要显式地关闭
        * */
        iss.destroy()
    }


相关文章
|
6月前
|
设计模式 开发框架 Java
Spring及工厂模式概述
Spring及工厂模式概述
52 8
|
5月前
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
47 1
|
1月前
|
Java 数据库连接 数据库
让星星⭐月亮告诉你,SSH框架01、Spring概述
Spring是一个轻量级的Java开发框架,旨在简化企业级应用开发。它通过IoC(控制反转)和DI(依赖注入)降低组件间的耦合度,支持AOP(面向切面编程),简化事务管理和数据库操作,并能与多种第三方框架无缝集成,提供灵活的Web层支持,是开发高性能应用的理想选择。
36 1
|
3月前
|
Java API Spring
Spring5入门到实战------1、Spring5框架概述、入门案例
这篇文章是Spring5框架的入门教程,概述了Spring框架的核心概念和特点,并通过一个创建普通Java类的案例,详细演示了从下载Spring核心Jar包、创建配置文件、编写测试代码到运行测试结果的完整流程,涵盖了Spring IOC容器的使用和依赖注入的基本用法。
|
6月前
|
安全 前端开发 Java
学习从Struts迁移到Spring的策略概述
从Struts框架迁移到Spring框架是一个常见的升级路径,主要是为了利用Spring框架提供的更多功能、更好的模块化支持以及更广泛的社区资源。
95 3
|
5月前
|
XML 开发框架 Java
Spring框架第一篇(Spring概述与IOC思想)
Spring框架第一篇(Spring概述与IOC思想)
|
6月前
|
安全 Java 大数据
Spring概述、系统架构及核心概念
Spring概述、系统架构及核心概念
205 0
|
5月前
|
开发框架 前端开发 Java
Spring概述(1)
Spring概述(1)
49 0
|
6月前
|
前端开发 Java 应用服务中间件
Spring MVC框架概述
Spring MVC 是一个基于Java的轻量级Web框架,采用MVC设计模型实现请求驱动的松耦合应用开发。框架包括DispatcherServlet、HandlerMapping、Handler、HandlerAdapter、ViewResolver核心组件。DispatcherServlet协调这些组件处理HTTP请求和响应,Controller处理业务逻辑,Model封装数据,View负责渲染。通过注解@Controller、@RequestMapping等简化开发,支持RESTful请求。Spring MVC具有清晰的角色分配、Spring框架集成、多种视图技术支持以及异常处理等优点。
83 1
|
6月前
|
安全 Java API
第1章 Spring Security 概述(2024 最新版)(下)
第1章 Spring Security 概述(2024 最新版)
103 0