Spring框架的作用
主要解决了创建对象和管理对象的问题,程序员定义类之后无需自己创建对象,对象已经由Spring框架帮你创建好了,若要使用直接从Spring容器获取。这也体现了Spring框架的两大核心之一,IOC,即将对象的创建权交由Spring管理。
如何将创建的类交由Spring去创建
两种配置方式:显示配置和隐式配置
显示配置:
通过@Bean注解完成,@Bean注解一定是作用于配置类的,并且@Bean注解作用于方法上方。配置类是是Spring框架核心的一个类,通过注解@Configuration来表示。
上下文获取Bean对象的方式:
1. 配置类添加@Configuration注解,并显式配置Bean
2. 测试包下的测试类中,获取上下文对象,并通过BeanId获取Bean对象
- 上下文对象的获取:
ApplicationContext context = SpringApplication.run(ExplicitConfig.class);
显式配置中,BeanId取决于方法名,方法名即为BeanId
1. 根据BeanId获取:getBean(String beanId) - Object (一般最后都会强转为指定的类型)
2. 根据BeanId,并指定类型获取:getBean(String beanId,Class<T>) - T
3. 根据类型获取: getBean(Class<T>) -- T
注意:根据类型获取必须要求该类型的实例只有一个
@Bean方法参数注入
若需要参数注入,在配置类里显示配置Bean的方法中,可以给出指定类型的参数,Spring在调用添加了@Bean注解的方法时,会自动根据参数类型找到匹配的Bean对象,并将其注入
隐式配置:
在类的上方添加组件类注解 - @Component(通用组件注解),@Controller(控制器组件),@Service(业务层组件),@Respository(持久层组件)中的一个;在配置类上方添加注解@ComponentScan(指定包),加载配置类时会到指定包下进行组件扫描
隐式配置Bean的BeanId命名规则:
默认根据类名得知BeanId:类名首字母大写,第二个字母小写,beanId为首字母小写的名称,否则,beanId为类全名
也可以自定义beanId,在注解中添加属性值 @Component("stu")
显示配置和隐式配置如何使用?
一般自己写的类用隐式配置,不是自己写的类用显示配置,因为第三方的类的包不在组件扫描的包下,并且没办法在第三方类上添加组件注解
Bean的作用域
1. singleton -- 单例
2. prototype -- 原型:每次从Spring容器获取某个Bean,每次均返回新的实例
3. session -- 每个session对象均创建一个新的实例
4. request -- 每次请求均创建一个新的实例
可以通过注解@Scope("....")来修改作用域,分配Bean方式不同,作用的位置不同。
- 显式配置Bean
@Bean作用在方法上方配置
用法:
@Bean
@Scope("prototype")
public UserController userController(UserMapper userMapper){
return new UserController(userMapper);
}
- 隐式配置Bean
@Component作用在类的上方
依赖注入
@Autowired注解:
Spring框架提供的注解,默认根据类型注入对象
注入方式有3种:
1. 构造方法注入
注意:若构造方法只有一个,则该注解可选
2. setter注入/set方法注入
3. 字段注入若注入的依赖项不存在,Spring容器启动失败,但是若存在这样的需求(不论依赖项是否存在,均要实例化Bean,此时可以使用属性required=false),该属性的作用:仅当依赖项存在,才注入,若不存在,不注入。
若注入的类型对应的依赖项有多个 ,此时会产生歧义,启动Spring容器直接报错,可以
1. 使用@Qualifier指定BeanId
2. 若没有@Qualifier,则自动根据beanId查找,若找到依赖项,则注入;若找不到,则注入失败
@Resource注解
该注解是java提供的,默认是根据beanname(beanId)注入的,若根据beanId找不到匹配的Bean对象,则自动回退到根据类型进行匹配
1、setter注入时,bean-name是根据set方法名得出的
setAccountRepo(...)则bean-name为set后的首字母小写的名称,即为 accountRepo
2 、该注解只支持setter注入和字段注入
3、@Resource(name="xxx") 会根据指定的beanname去查找对应的Bean对象