目录
之前存储Bean,需要在spring-config 中添加一行bean 注册内容
Spring有更简单的读取和存储对象方法
1.1配置扫描路径
即使添加了注解,如果不是在配置的扫描包下的类对象,也是不能被存储到 Spring 中的。
1.2添加注解存储Bean对象
- 类注解:@Controller @Service @Repository @Component @Configuration
- 方法注解:@Bean
1.2.1@Controller(控制器存储)
@Controller
public class UserController2 {
public void sayHi(){
System.out.println("sayHi()");
}
1.2.2@Service(服务存储)
@Service
public class UserController2 {
public void sayHi(){
System.out.println("sayHi()");
}
1.2.3 @Repository(仓库存储)
@Repository
public class UserController2 {
public void sayHi(){
System.out.println("sayHi()");
}
1.2.4 @Component(组件存储)
@Component
public class UserController2 {
public void sayHi(){
System.out.println("sayHi()");
}
1.2.5 @Configuration(配置存储)
@Configuration
public class UserController2 {
public void sayHi(){
System.out.println("sayHi()");
}
Main方法:
ApplicationContext context=
new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2=context.getBean("userController2",UserController2.class);
userController2.sayHi();
执行结果:
当前对象无法存储到spring:
1.五大注解不在component-scan下
2.在component-scan下但没有加五大注解
1.3 JavaEE标准分层
1.4 Bean命名规则
默认情况下是小驼峰(首字母小写),如果类名首字母和第二个字母都为大写,Bean名称为原类名。
1.5 方法注解 @Bean
@Bean
public User user1(){
User user1=new User();
user1.setUid(2);
user1.setUsername("lisi");
user1.setAge(18);
return user1;
}
但是会报错:
报错原因:
1.@Bean命名规则,默认情况下,@Bean存储对象的名称=方法名
2.@Bean注解必须配合五大注解使用
1.5.1 @Bean的重命名
@Bean(name = {"user1","u1"})
public User user1(){
User user1=new User();
user1.setUid(2);
user1.setUsername("lisi");
user1.setAge(18);
return user1;
}
注意事项:当给@Bean重命名后,默认的使用方法名获取对象的方式就不能用了
1.6 获取 Bean 对象
获取Bean对象也叫对象装配,是把对象取出来放在某个类中,也叫对象注入
1.6.1 实现方法
- 属性注入
- 构造方法注入
- Setter注入
1.6.2 属性注入
Service 类的实现代码如下:
@Service
public class UserService {
public void init(){
System.out.println("do UserService");
}
}
Controller 类的实现代码如下:
@Controller
public class UserController2 {
@Autowired
private UserService userService;
public void printUser2(){
userService.init();
}
}
获取Controller类中的printUser2()方法:
public class APP {
public static void main(String[] args) {
ApplicationContext context=
new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2=context.getBean("userController2",UserController2.class);
userController2.printUser2();
}
}
执行结果:
1.6.3 构造方法注入
Controller 类的实现代码如下:
@Controller
public class UserController2 {
private UserService userService;
// @Autowired
public UserController2(UserService userService){
this.userService=userService;
}
public void printUser2(){
userService.init();
}
}
获取Controller类中的printUser2()方法:
public class APP {
public static void main(String[] args) {
ApplicationContext context=
new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2=context.getBean("userController2",UserController2.class);
userController2.printUser2();
}
}
执行结果:
注意事项:
如果是只有一个构造方法,可以不写@Autowired,如果有多个构造方法则需要加上@Autowired表明使用哪个构造方法
1.6.4 Setter注入
Controller 类的实现代码如下:
@Controller
public class UserController2 {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService=userService;
}
public void printUser2(){
userService.init();
}
}
获取Controller类中的printUser2()方法:
public class APP {
public static void main(String[] args) {
ApplicationContext context=
new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2=context.getBean("userController2",UserController2.class);
userController2.printUser2();
}
}
执行结果:
注意事项:
Setter注入的 @Autowired不能省略,不然会报空指针异常
1.6.5 三种注入方法的区别
在构造方法中可以注入一个不可变对象,而Setter注入和属性注入不能注入一个不可变对象,为什么呢?
理由:在Java中,被final修饰的对象要满足以下任意一个条件
1. 被final修饰的对象需要直接赋值
2.被final修饰的对象需要在构造方法中赋值