【Spring】-- 注解方式存储Bean

        通过注解的方式将Bean对象存储到Spring容器中,主要涉及两种注解一种是修饰类的注解,一种是修饰方法的注解。

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。
  2. 方法注解:@Bean。

目录

目录

1. 使用规则

        1.1 扫描路径

        1.2 通过类注解注入的Bean的命名规则

        1.3 通过方法注解注入的Bean的命名规则

        1.4 通过方法注解注入的Bean的其他规则

2. 类注解


1. 使用规则

        1.1 扫描路径

         这两种注解都需要在扫描路径下使用,否则无效。在项目resource目录下创建xml文件并配置扫描路径。

         不再使用<bean></bean>标签来手动注册Bean对象,通过扫描路径直接扫描带注解的类或者方法然后将其放入容器中。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--    手动注入    -->
    <!--    <bean id="user" class="com.beans.User"></bean>-->

    <!--    配置扫描路径,声明Bean对象的所在位置    -->
    <content:component-scan base-package="com.beans"></content:component-scan>
</beans>

        1.2 通过类注解注入的Bean的命名规则

        它在容器中的名字取决于类名,具体地,这通常意味着将第一个字符从大写转换为小写,但在(不寻常的)特殊情况下,当有多个字符,并且第一个和第二个字符都是大写时,我们直接使用它。比如这几个类名,"FooBah" 被转变为 "fooBah" , "X" 被转变为 "x", 但是 "URL" 保持 "URL"。

Utility method to take a string and convert it to normal Java variable name capitalization. This normally means converting the first character from upper case to lower case, but in the (unusual) special case when there is more than one character and both the first and second characters are upper case, we leave it alone.
Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays as "URL".       

    public static String decapitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                        Character.isUpperCase(name.charAt(0))){
            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }

        1.3 通过方法注解注入的Bean的命名规则

        它在容器中的名字默认为方法名,如果设置别名则无法使用方法名,可以设置多个别名

源码方法中主要涉及到命名的部分源码。

private void loadBeanDefinitionsForBeanMethod(BeanMethod beanMethod) {

       
        ...

        // 获取 方法名称
        String methodName = metadata.getMethodName();

        // @Bean.name解析
        List<String> names = new ArrayList<>(Arrays.asList(bean.getStringArray("name")));

        // 获取第一个别名,没有别名就用方法名
        String beanName = (!names.isEmpty() ? names.remove(0) : methodName);

        // 注册别名 beanName----别名
        for (String alias : names) {
            //注册剩下的别名 放到别名Map中 ,key 是别名 value 是名称
            this.registry.registerAlias(beanName, alias);
        }

        ...
    }

        通过方法注解起别名的方法,可以使用name和value属性进行重命名


@Bean("bean")
@Bean(name = "bean")
@Bean(name = {"bean1", "bean2"})
@Bean({"bean", "bean2"})

@Bean(value = "bean")
@Bean(value = {"bean1", "bean2"})

        1.4 通过方法注解注入的Bean的其他规则

  • 使用@Bean注解必须搭配类注解
  • 使用@Bean注解的方法是没有参数的。也就是说这个方法不能重载的,重载的其中一个要求就是参数列表不同。
  • 使用@Bean注解注入多个相同类型且同名的Bean时,容器中只认第一个注册的Bean,其他不考虑。

2. 类注解

@Controller、@Service、@Repository、@Component、@Configuration

  • 类注解之间的关系:其他四个都是基于@Component注解实现的。
  • 分类的原因:这几个注解分别对应业务的几个层面,主要起到标识作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值