一、IoC模式
系统中通过引入实现了IoC模式的IoC容器,即可由IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。
IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释。
控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。
所谓的"控制反转"就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。IoC体现了好莱坞原则 - "Don’t call me, we will call you"。
依赖注入的基本原则是应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由容器负责,查找资源的逻辑应该从应用组件的代码中抽取出来,交给容器来完成。
DI是对IoC更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
摘自《Java面试题全集下 - 骆昊》
二、Spring的配置的三种方法:
1、POJO+.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 id="stu2" class="org.mobiletrain.springdemo.Student"
scope="prototype">
<property name="name" value="李小二" />
<property name="age" value="18" />
<property name="vehicle" ref="train" />
</bean>
<bean id="stu" class="org.mobiletrain.springdemo.Student">
<!-- 构造器注入 -->
<constructor-arg index="0" value="小二" />
<constructor-arg index="1" value="18" />
<!-- 通过属性引用对象(设值注入-setter注入) -->
<property name="vehicle" ref="train" />
</bean>
<!-- spring调用已定义的有参构造器直接创建对象和属性的顺序传参 -->
<bean id="train" class="org.mobiletrain.springdemo.Vehicle">
<constructor-arg index="0" value="和谐号" />
<constructor-arg index="1" value="350" />
</bean>
<!-- spring调用已定义的有参构造器直接创建对象和属性的类型 -->
<bean id="car" class="org.mobiletrain.springdemo.Vehicle">
<constructor-arg type="java.lang.String" value="BYD F1" />
<constructor-arg type="int" value="80" />
</bean>
<!-- spring调用无参构造器通过反射用属性创建对象 -->
<bean id="digger" class="org.mobiletrain.springdemo.Vehicle">
<property name="info" value="挖掘机" />
<property name="maxSpeed" value="20" />
</bean>
</beans>
调用IoC容器的方法为:
ClassPathXmlApplicationContext ctx = new
ClassPathXmlApplicationContext("appliationContext.xml");
spring几乎把所有的无状态对象都做成了单例
scope="prototype" -- 不想用单例就添加这个属性,scope有四个选择,如下:1) -prototype多例, 2) -session绑定会话, 3) -requrst绑定请求, 4) -singleton单例
注入依赖关系的方式有三种:
1、setter注入(推荐)
2、构造器注入
3、接口注入
必要属性建议通过构造器进行注入,非必要属性通过setter注入是更好的选择
2、注解+.xml文件(.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.mobiletrain.springdemo"/>
<!-- 自动配置打注解 -->
<bean class="java.util.Date" />
<bean id="digger" class="org.mobiletrain.springdemo.Vehicle">
<property name="info" value="挖掘机" />
<property name="maxSpeed" value="20" />
</bean>
<bean id="a" class="java.lang.String">
<constructor-arg index="0" value="李小二" />
</bean>
</beans>
调用IoC容器的方法为:
ClassPathXmlApplicationContext ctx = new
ClassPathXmlApplicationContext("appliationContext.xml");
此方法需要在Javabean上打注解:
spring注解:用注解会和spring耦合
1、@Component -- org.springframework.stereotype.Component;普通
2、@Repository -- import org.springframework.stereotype.Repository;持久层
3、@Controller -- org.springframework.stereotype.Controller;
4、@Service -- org.springframework.stereotype.Service;业务层
@Qualifier -- org.springframework.beans.factory.annotation.Qualifier;
@Autowired -- org.springframework.beans.factory.annotation.Autowired;自动装配
如果当spring上下文中存在不止一个类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.example"/>
这些都得加进来。
3、零配置:配置类+注解;
import java.util.Date;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 用代码配置IoC容器(目前比较流行的方式是用代码配置代码)
@Configuration
public class AppConfig {
@Bean
public Student student() {
return new Student("小二", 18);
}
@Bean(name="car")
public Vehicle vehicle() {
return new Vehicle("Benz",200);
}
@Bean(name="digger")
public Vehicle digger() {
return new Vehicle("挖掘机", 200);
}
@Bean
public Date birthday() {
return new Date();
}
}
调用IoC容器的方法为:
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfig.class);
此方法也需要在Javabean上打注解,不够很简单!只需要在类上打上@Component
三、使用maven自动导入spring-jar包
注意:将maven的URL改为Apache的镜像文件:
H:\maven\apache-maven-3.3.9\conf\settings.xml
此方法可以将maven联网下载相关的jar包的速度提升很多,基本显示秒下。
1、导入核心依赖包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
2、导入测试依赖包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>