spring的出现就是为了解耦合,充当一个管家的角色。
Spring把代码根据功能划分:
- 主业务逻辑代码
- 代码逻辑联系紧密,耦合度高,复用性低。
- 降低主业务代码之间的耦合度 =>> 控制反转 IOC
- 系统级业务逻辑(交叉业务逻辑)
- 功能相对独立,没有具体的业务场景,主要是提供系统级服务,如日志,安全,事务等,复用性很强。
- 降低主业务逻辑和系统级服务之间的耦合度 =>> 面向切面编程 AOP
一,控制反转 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() }
结果
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() }