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>