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对象