9/2 Spring学习博客 (一)

对象的管理

以昨天的简易图书管理改造

1.存对象:@Component
d5c4f269c5326fde3301a3fb3da55617

5616e72e32f4905dda974940157224b5

2.取对象:@AutoWired

eac6faa6c7f17a55b847358773061a0f

074df2ba715c5ee68e957f23200d9c9a

使用这个IOC的好处呢就是 可以实现资源的集中管理,不用哪里用哪里new了,创建实例时候,也不需要了解其中的细节。

IOC五大注解和方法注解

五大注解:
@Controller

@Service

@Component

@Repository

@Configuration

方法注解:@Bean

这些注解都体现了IOC

我们这里通过启动类里的 Spring上下文来获取这些bean(Spring管理的对象称之为bean)

例子:

@Controller
public class UserController {
    public void sayHi(){
        System.out.println("hello UserController");
    }
}
        ApplicationContext context = SpringApplication.run(IocApplication.class, args);

        UserController bean = context.getBean(UserController.class);
        bean.sayHi();

运行结果:
image

从这里看出@Controller确实交给Spring管理了

插一句 获取bean的方式

1.根据类获取bean

UserController bean = context.getBean(UserController.class);

2.根据名称获取bean
Spring 帮我们创建对象时,会给每个对象起一个名字

UserService userService = (UserService)context.getBean("userService");

3.根据名称和类获取bean

UserComponent userComponent = context.getBean("userComponent", UserComponent.class);

那如果想直接设置名称 就Component("beanName")

78dd142b1612378afd45878522014679

五大注解的IOC体现代码:

 ApplicationContext context = SpringApplication.run(IocApplication.class, args);

        UserController bean = context.getBean(UserController.class);
        bean.sayHi();


        UserService userService = (UserService)context.getBean("userService");
        userService.sayHi();

        UserComponent userComponent = context.getBean("UUUU", UserComponent.class);
        userComponent.sayHi();

        UserRepository userRepository = context.getBean("userRepository", UserRepository.class);
        userRepository.saiHi();

        UserConfiguration userConfiguration = context.getBean("userConfiguration", UserConfiguration.class);
        userConfiguration.saiHi();

image

五大注解 单从功能上 除了Controller 其他效果的都是一样的,但是从概念上还被赋予别的含义
1b07ef9c57eb5a24bef4cc01a6966257

他们之间的关系就能看出
00c05d81b08562b669ce83f48eb8c034

五大注解只能加在自己的代码上,很多时候开发可能引入第三方jar包,比如使用jdbc 会使用第三方的数据源,如果想把数据源交给Spring,但是我们不能在数据源上加五大注解 所以这时候就需要@Bean

假设一个datasource,这时候我们希望这个对象能给Spring管理

@Data
public class UserInfo {
    private Integer id;
    private String name;
    private Integer age;
}

并且创建对象信息:

public class BeanConfig {

    @Bean
    public UserInfo userInfo(){
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setName("zhangsan");
        userInfo.setAge(18);
        return  userInfo;
    }
}

运行:

        UserInfo userInfo = context.getBean(UserInfo.class);
        System.out.println(userInfo);

报错:NoSuchBeanDefinitionException:

这是因为@Bean 不能孤零零地放在一个 Spring 根本不知道的普通类里;它所在的类需要先进入 Spring 容器。通常配置 Bean 时就配合 **@Configuration **使用。

所以完整的应该是:

@Configuration
public class BeanConfig {

    @Bean
    public UserInfo userInfo(){
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setName("zhangsan");
        userInfo.setAge(18);
        return  userInfo;
    }
}

image

@Bean注解 定义的对象 默认名称为方法名
@Bean也能像五大注解一样进行重命名,又或者这样 @Bean({"u1","u2"}) ,不是创建两个 Bean,而是给同一个 Bean 起两个名字/别名。

总结

告诉Spring管理bean,bean的存储

1.类注解 : 五大注解 @Controller @Service @Repository @Configuration @Component
使用场景: 自己开发的程序

2.方法注解 : @Bean
使用场景 1)存储第三方对象,代码不在自己的项目里。2)一个类型需要创建多个对象

Bean的名称
1.五大注解:
类名首字母小写,如果前两位字母为大写则为原类名。
也可以指定Bean名称 方法为:@Controller("beanName")

2.@Bean
默认名称方法名,也可以指定名称

获取Bean的方式
通过ApplicationContext 上下文 来获取

获取bean的功能是 BeanFactory提供的

扫描路径:Spring默认扫描路径是 启动类所在的路径

或者可以通过 @ComponentScan("path")来指定扫描路径

posted @ 2026-09-02 17:32  曾章吉的浩吧  阅读(3)  评论(0)    收藏  举报