一,Spring是什么及常用注解
先说什么是spring,在前面的博客中已经知道了,spring是一个开源框架,为了让我们开发更加简单,那关于ioc呢,一句话概况一下:Spring就是包含了众多工具方法的Ioc容器
注解:
共有两类大注解:
类注解:@Controller、@Service、@Repository、@Component、@Configuration.
⽅法注解:@Bean.
@Controller:控制器存储,控制层,接收请求,对请求进⾏处理,并进⾏响应.
@Service:服务存储,也就是用来存储业务层组件。
@Repository:仓库存储,也称为持久层.负责数据访问操作。
@Component:组件存储,使其能够被Ioc自动扫描识别并管理。
@Configuration:配置存储,处理项⽬中的⼀些配置信息。
@Bean:方法注解,@Bean注解的方法会产生一个Bean对象,该对象由Spring管理并放到IoC容器中。
@Autowired:注入依赖,在Controller层和Service层注⼊运⾏时依赖的对象
二, 什么是Ioc
也就是比如在平常创建对象需要一个一个new,而使用了它之后,就不需要了,交给容器,集中处理,一键完成,方便省事。
Ioc:Inversion of Control (控制反转)也就是将创建对象的控制权反转到Spring上。
IOC的优点:
1.资源的集中管理,我们需要使用的时候,直接在容器里取就可以了。
2.降低耦合度,不会牵一发而动全身,降低了依赖程度。
也就是我们将一些自己需要创建的东西外包出去,然后使他们来负责,这样即使出了问题,让他们修改就行了,我们也不用整体改了。
三,什么是DI
从上述可以看出IOC在处理的时候,其实也就是一个依赖注入的容器,而依赖注入就是DI。
DI:依赖注入,也就是在容器运行期间,动态的为应用程序提供运行时所依赖的资源。
DI也就是Ioc的一种实现,也就比如今天想出去下馆子,那么下馆子就是IOC,而去吃川菜和粤菜,就是DI。
三,依赖注入
spring依赖注入主要分为三种实现方式:属性注入,构造方法注入,setter注入
3.1属性注入
应用层代码:
@Service
public class UserService {
public void doService(){
System.out.println("service ...");
}
}
控制层代码:
@Controller
public class HelloConteoller {
@Autowired
private UserService userService;
public void sayHi(){
userService.doService();
System.out.println("HelloConreoller");
}
3.2构造方法注入
构造方法是在类的构造方法中实现注入:
控制层代码:
@Controller
public class HelloConteoller {
//构造方法注入
private UserComponent userComponent;
public HelloConteoller(UserService userService){
this.userService = userService;
}
@Autowired
public HelloConteoller(UserService userService, UserComponent userComponent){
this.userService = userService;
this.userComponent = userComponent;
}
}
3.3setter方法注入
在设置setter方法的时候要加@Autowired注解。
控制层代码:
@Controller
public class HelloConteoller {
// setter方法注入:
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}
public void sayHi(){
userService.doService();
System.out.println("HelloConreoller");
}
}
3.4三种方法优缺点
1.属性注入:
优:简洁,方便
缺:只能使用IOC容器,其他不行,不能注入一个Final修饰的属性。
2.构造方法注入:
优:可以注入Final修饰的属性,注入的对象不会被修改,任何框架都可以支持。
缺:注入多个对象要一个一个打代码。
3.setter方法注入
优:在类实例之后,还能对该对象进行配置或者注入。
缺:也不能注入Final修饰的属性,setter方法被多次调用就会有被修改的风险。