Spring更简单的读取对象

文章介绍了如何在Spring框架中使用注解来管理Bean,包括@Controller、@Service、@Repository、@Component和@Configuration等,以及@Bean的使用方法,强调了方法注解的配合使用和参数注入。此外,还提到了Bean的命名规则和配置文件中的bean定义方式。
摘要由CSDN通过智能技术生成

1.存储Bean对象

1.1前置工作:扫描配置路径

在spring-config中添加以下配置:

<?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">
    

</beans>

1.2添加存储Bean对象

1.类注解:@Controller,@Service,@Repository,@Component,@Configuration

2.方法注解:@Bean

1.2.1Controller

控制器,通常是指程序的入口,比如参数校验,参数类型转换……前置工作处理

@Controller
public class UserController {
    public void sayHi(){
        System.out.println("hi,controller");
    }
}
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController=(UserController) context.getBean("userController");
userController.sayHi();

1.2.2@Service

服务,一般写业务代码,服务编排,调用DB,调用第三方接口

public class UserService {
    public void doService(){
        System.out.println("hi,service");
    }
}
UserService userService=(UserService) context.getBean("userService");
userService.doService();

1.2.3@Repository

仓库,通常是指DB操作相关的代码

@Repository
public class UserRepository {
    public void doRepository(){
        System.out.println("hi,repository");
    }
}
UserRepository userRepository=(UserRepository) context.getBean("userRepository");
userRepository.doRepository();

1.2.4@Component

其他的对象

@Component
public class UserComponent {
    public void doComponent(){
        System.out.println("hi,component");
    }
}
UserComponent userComponent=(UserComponent) context.getBean("userComponent");
userComponent.doComponent();

1.2.5@Configuration

配置

@Configuration
public class UserConfiguration {
    public void doConfiguration(){
        System.out.println("do,configuration");
    }
}
UserConfiguration userConfiguration=(UserConfiguration) context.getBean("userConfiguration");
        userConfiguration.doConfiguration();

1.3为什么有这么多注解

程序的工程分工:

1.3.1类注解之间的关系

 其实这些注解⾥⾯都有⼀个注解 @Component,说明它们本身就是属于 @Component 的“⼦类”。

1.3.2Bean命名规则

推测:注解对应的bean名称,时首字母小写

判断bean是否有自定义的名称

public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
        if (definition instanceof AnnotatedBeanDefinition) {
            String beanName = this.determineBeanNameFromAnnotation((AnnotatedBeanDefinition)definition);
            if (StringUtils.hasText(beanName)) {
                return beanName;
            }
        }

        return this.buildDefaultBeanName(definition, registry);
    }

 getBeanClassName是全限定路径名称

protected String buildDefaultBeanName(BeanDefinition definition) {
        String beanClassName = definition.getBeanClassName();
        Assert.state(beanClassName != null, "No bean class name set");
        String shortClassName = ClassUtils.getShortName(beanClassName);
        return Introspector.decapitalize(shortClassName);
    }

 前两位均为大写时,返回自身name,否则,首字母小写

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.4方法注解Bean

 @Bean
    public User user1(){
        User user=new User();
        user.setName("李四");
        user.setAge(18);
        return user;
    }

但是当我们直接执行,却获取不到。

1.4.1⽅法注解要配合类注解使用

如下代码所示:

@Configuration
public class BeanConfig {
    @Bean
    public Integer age(){
        return 11;
    }

    @Bean(name={"aaa","user"})
    public User user(Integer age){
        User user=new User();
        user.setName("张三");
        user.setAge(age);
        return user;
    }
    @Bean
    public User user1(){
        User user=new User();
        user.setName("李四");
        user.setAge(18);
        return user;
    }
}

1.4.2@Bean重命名

@Bean(name={"aaa","user"})
    public User user(Integer age){
        User user=new User();
        user.setName("张三");
        user.setAge(age);
        return user;
    }
User user=(User) context.getBean("user");
        System.out.println(user.getName());

1.4.2@Bean参数

传参时,@Bean会根据参数类型寻找参数。

 @Bean
    public Integer age(){
        return 11;
    }

    @Bean(name={"aaa","user"})
    public User user(Integer age){
        User user=new User();
        user.setName("张三");
        user.setAge(age);
        return user;
    }

使用Spring xml配置的方式传参,加入以下标签:

<bean id="user" class="com.bite.User">
        <constructor-arg name="name" value="张三"></constructor-arg>
    </bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李(写代码版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值