spring学习1:IOC的概念和作用
一、spring的优势
1.1 方便解耦,简化开发
通过spring提供的ioc容器,可以将对象间的依赖关系交给spring管理,避免硬编码造成的程序过渡耦合
1.2 AOP编程的支持
通过spring的aop功能可以实现面向切面编程
1.3 声明式的事务支持
1.4 方便集成其他第三方框架
二、ioc的概念和作用
ioc指的是控制反转,指的就是以前我们获取一个对象时采用的是自己创建一个的方式,这是一个主动的过程;而控制反转后,当我们需要对象时就跟工厂要,而工厂来帮我们创建或者查找对象,这是一个被动的过程。
这种被动接收对象的方式就是控制反转。
它的作用是削减计算机程序的耦合(解除代码中的依赖关系)
三、spring ioc的简单使用
创建一个maven工程,引入spring的依赖
pom文件的内容如下
4.0.0
com.lyy
spring01
1.0-SNAPSHOT
log4j
log4j
1.2.17
org.projectlombok
lombok
1.16.16
junit
junit
4.12
org.springframework
spring-context
5.0.2.RELEASE
org.springframework
spring-test
5.0.2.RELEASE
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
1.8
创建一个UserService的接口和实现类,以下是实现类
public class UserServiceImpl implements IUserService {
@Override
public void findAllUser() {
userDao.findAll();
System.out.println("查询全部用户");
}
}
在resources目录下创建spring的配置文件applicationContext.xml,在其中配置一个userService的bean
测试使用ioc来获取对象
public class Test2 {
public static void main(String[] args) {
//加载配置文件,初始化spring容器
ApplicationContext app=new ClassPathXmlApplicationContext("applicationCotext0.xml");
//获取bean
IUserService userService= (IUserService) app.getBean("userService");
//执行bean的方法
userService.findAllUser();
}
}
以上的测试方法中,先初始化了spring容器,在这个过程中spring会将配置文件中配置的bean对象都放在容器中。然后再从容器中根据bean的id获取对象,执行对象的方法。
四、实例化bean的三种方式
4.1 使用无参数构造函数
默认情况下spring会使用bean的class指定的类中的无参数构造函数来创建bean,如果没有无参构造就会创建失败。
4.2 spring管理静态工厂,使用静态工厂的方法来创建bean对象
模拟一个静态工厂
public class UserServiceFactory {
public static IUserService getInstance(){
return new UserServiceImpl();
}
}
在spring配置文件中使用工厂
4.3 spring管理实例工厂,使用实例工厂的方法来创建bean对象
模拟一个实例工厂
public class UserServiceFactory2 {
public IUserService getUserService(){
return new UserServiceImpl();
}
}
在spring配置文件中先把实例工厂配置为bean,在使用实例工厂来创建对象
五、spring的依赖注入
通过控制反转, 把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。 ioc 解耦只是降低他们的依赖关系,但不会消除。例如service层的实现类肯定会依赖dao层。使用spring后可以让spring来维护这种依赖关系,就是让框架把持久层的对象传到service层
5.1 构造方法注入
在配置bean的标签中使用constructor-arg 标签来给bean注入属性
以下是一个用户类
public class User {
private String name;
private String age;
}
下面通过构造方法在配置bean时传入属性
5.2 set方法注入
在bean对应的类中提供set方法,在配置文件中使用proerty标签来传递属性值
5.3 p名称空间注入,本质还是set方法
5.4 注入集合属性
5.4.1 数组
用来给bean中的数组类型的属性注入值
element1
element2
element3
5.4.2 List
用来给bean中的List类型的属性注入值
1
2
3
5.4.3 Set
用来给bean中的Set类型的属性注入值
1
2
3
5.4.4 Map
用来给bean中的Map类型的属性注入值
5.4.5 Properties
用来给bean中的Properties类型的属性注入值
1
1
1