Spring 是一个包含众多工具的IOC容器
Spring包含两大核心思想
IOC和AOP
IOC:控制反转,容器:可以装东西
(Spring是装对象的容器)
例如加一个注解,就是让Spring帮你去管理代码。
ioc是一种思想,DI是一种实现方式,
DI是一种依赖注入
@Autowired 告诉Spring ,从容器中取出这个对象,赋值给当前对象属性
@Autowired
private Framework framework;
-----------------------------------------------
private Framework framework;
public Car(){
framework = new Framework();
}
上面的代码就等价于下面的代码
@SpringBootApplication
public class IocStudyApplication {
public static void main(String[] args) {
ApplicationContext context= SpringApplication.run(IocStudyApplication.class, args);
}
}
启动代码会返回一个容器,使用ApplicationContext 去接收这个Sping 的运行环境翻译为上下文
可以使用getBean来获取里面的内容,主要有三种,第一种为根据名称来取,第二章为根据类型来取,第三种为根据名称和类型来取
根据名称获取时,要使用小驼峰来获取,如果前两个字母都是大写的,那么前两个字母都要小写
获取Bean的两种方式
ApplicationContext 和BeanFactory
继承关系和功能来说ApplicationContext是BeanFactory的子类,不但有BF的所有功能,还有独特的特性,比如对国际化支持,资源访问支持,以及事件传播,等等。
性能来所,ApplicationContext一次性加载并初始化了所有的Bean对象,而BF是需要才会加载,更加轻量。但如今以及不缺空间了,所以不如直接用AP
5大注解@Controller @Service @Respitory @Configuration @Componet
作用类型都是类,都是为了将类加入到容器里面,表示让Spring帮忙管理这个对象
只能加在类上,并且只能加在自己的代码上面
如果我引入了一个第三jar包,也希望交给Spring管理,是没有办法加五大注解的
@ComponentScan可以指定扫描路径
方法注解@Bean
Bean必须搭配五大注解来使用
用@Bea数参数,根据名称来获取
如果需要Bean的类型,对应的对象只有一个时,就直接赋值,如果有多个时,根据名称进行匹配
SpringBoot的一个特点,约定大于配置
DI依赖注入的方式
1.属性注入
2.构造方法注入
3.Set方法注入
1.使用@Autowired注入
@Controller
public class UserController {
@Autowired
private UserService userService;
public void doController(){
System.out.println("do Controller");
}
}
优点:简洁方便
缺点,只能用于IOC容器,不能注入一个final修饰的对象
2.构造方法:注意添加了有参的构造函数后,也应该把无参的构造函数加上
@Controller
public class UserController {
// @Autowired
// private UserService userService;
private UserService userService;
public UserController(UserService userService){
this.userService=userService;
}
public void doController(){
userService.doS();
System.out.println("do Controller");
}
}
优点:可以注入final对象,它注入的对象不会被修改。通用性好。
缺点,注入多个时,比较繁琐。
如果存在多个构造函数需要加上@Autowired,注明使用那个构造函数,如果只有一个构造函数,则可以省略。
3.set注入
@Controller
public class UserController {
// @Autowired
// private UserService userService;
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService=userService;
}
public void doController(){
userService.doS();
System.out.println("do Controller");
}
}
优点:注入完后,可以通过set去修改属性。也同样是缺点。
注意Autowried会存在一些问题,如果一个类型存在多个对象时,有限进行名称匹配,如果名称匹配不上,就报错。
解决办法
1.属性名和需要使用的对象名保持一致
2.适用@primary注解标识默认的对象
@Primary
@Bean
public UserInfo userInfo2(){
UserInfo userInfo =new UserInfo();
userInfo.setAge(232);
userInfo.setId(2);
userInfo.setName("lisi");
return userInfo;
}
3.使用Qualifier来标注默认的对象
@Qualifier("u1")
@Autowried
private UserService userService;
4.使用Resource注解
Autowried是按类型来注入的,Resource是按名称来注入的
Autowried默认是按类型来注入的,但同一个类型如果有多个对象,就会按照名称匹配