9/2 Spring学习博客 (一)
对象的管理
以昨天的简易图书管理改造
1.存对象:@Component


2.取对象:@AutoWired


使用这个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();
运行结果:

从这里看出@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")

五大注解的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();

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

他们之间的关系就能看出

五大注解只能加在自己的代码上,很多时候开发可能引入第三方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;
}
}

@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")来指定扫描路径

浙公网安备 33010602011771号