spring的作用:创建和管理组件对象。
spring框架包含两个功能:
IoC(Inversion of Control):控制反转,指的是将对象的创建、管理等控制权交给了框架
DI(Dependency Injection):依赖注入,为对象的依赖项(类中的属性)注入值
如何将特定的对象交给spring容器:
首先要设置一个spring的扫描路径,指明这个包及其包中的所有子分支包中寻找含有添加了注解的对象或类。就像高中有30个班,添加注解就相当于给30个班中某些班打上标签,以后找人就从这些打了标签的班级找人。不会去没有打标签的班级找。
这里要注意包的扫描路径正确性,如果指定错误是找不到的,就相当于你想要指定高三的所有班级为寻找目标,但是你指定时错误的指定了高二。那肯定是错误的。
指定扫描路径通过在启动类上添加 @componentScan(“ccc”);注解,ccc为你的路径
- 类上添加spring的注解,如:@component ,@configuration ,及其包含这些注解的子孙注解
@Configuration public class BeanConfiguration { // 其他代码 }
- 方法上添加注解,@Bean ,用于方法上,将该方法的返回值交给spring管理
@Bean public UserController userController() { return new UserController(); }
spring Bean
- 被交给spring框架管理的对象统称为bean
- 默认情况下,bean是单例的,单例(简单的说就是只有一个实例化对象,单例模式是一种设计模式,可自行了解)。也可以通过
@Scope("prototype")
修改为非单例的(相当于局部变量) - 默认情况下,bean是预加载的,就是启动了spring项目就加载好了所有的bean对象,等待被使用,称为饿汉式;相反的,另一种方式是你需要使用特定的bean的时候才加载这特定的bean,称为懒加载,可以添加@Lazy注解指明为懒加载。
- 这些另加的注解位置在原注解并列的位置,如
@Configuration
public class BeanConfiguration {
@Bean
@Lazy
public UserController userController() {
return new UserController();
}
}
自动装配
在你的自定义类中,如果需要使用bean对象,这时候spring就会将加载好的对象通过一些手段给你使用。
- 属性装配(成员变量):在你的类中指定属性,这个属性是你交给spring框架的bean对象,通过在属性上添加@Autowired指明将该属性和特定bean对象绑定。
- 通过方法参数装配:在构造函数的参数中指明是哪个bean,或这set方法参数中给出;
其中:
- 只有一个构造函数。无需再添加@Autowired注解,spring框架会自动识别
- 有多个构造函数,且没有无参的。需要添加@Autowired注解,用于手动指明需要注入bean的构造函数
- 有多个构造函数,且有无参的。若都没有添加@Autowired,默认为无参构造注入bean
- 对于set方法的注入。都需要加入@Autowired。
@Resource
注解注入bean对象
@Resource
注解与@Autowired是类似的,但是又有所不同。下面说一下他们的不同:
- 所属的包:@Autowired是spring的注解,而
@Resource是javax的注解
识别bean的方式不同:@Resource先从已创建的bean实例中寻找名字与所需要的bean对比,如果有多个相同的名字都与所需相同,再对比所需的bean的类别Type。
@Autowired则是先类型后名字。- 使用的范围不同。@Autowired可添加在构造函数上,
@Resource却不可以。
public class CategoryServiceImpl implements ICategoryService {
// 属性注入
@Autowired
private ICategoryRepository categoryRepository;
private UserMapper usermapper;
// 构造函数注入
public CategoryServiceImpl (){
this.usermapper=new UserMapper();
}
// set函数自动装配 ↓↓↓↓↓↓↓↓↓↓
@Autowired
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
对于第二点,如果实在不喜欢当前的所需的bean的名字,可以通过手动指定
@Qulifier
注解指定Spring Bean的名称@Resource
的name
属性指定Spring Bean的名称
个人见解:
- 使用@Autowired而不使用
@Resource
使用属性注入而不使用构造参数的注入