目录
一、存储Bean对象
1、定义
2、存储方式
(1)、类注解
【1】、@Controller(控制器存储)
【2】、@Service(服务存储)
【3】、@Repository(仓库存储)
【4】、@Component(组件存储)
【5】、@Configuration(配置存储)
(2)、方法注解@Bean
3、重命名Bean
二、获取Bean对象
1、注入关键字@Autowired
(1)、属性注入
(2)、Setter注入
(3)、构造方法注入
2、注入关键字@Resource
3、@Autowired和@Resource的区别
4、解决同一类型多个@Bean报错
(1)、使用 @Resource 注解
(2)、使用 @Qualifier 注解
一、存储Bean对象
1、定义
- @Controller:业务逻辑层;
- @Service:服务层;
- @Repository:持久层;
- @Configuration:配置层;
注:@Controller、@Service、@Repository、@Configuration等注解都是属于@Component的"子类"。
2、存储方式
(1)、类注解
【1】、@Controller(控制器存储)
@Controller
public class UserController {public void func1() {System.out.println("func1");}
}
public class App {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");UserController userController=context.getBean("userController",UserController.class);userController.func1();}
}
【2】、@Service(服务存储)
@Service
public class UserService {public void func2() {System.out.println("func2");}
}
class App {public static void main(String[] args) {ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");UserService userService =context.getBean("userService",UserService.class);userService.func2();}
}
【3】、@Repository(仓库存储)
@Repository
public class UserRepository {public void func3() {System.out.println("func3");}
}
class App {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");UserRepository userRepository =context.getBean("userRepository",UserRepository.class);userRepository.func3();}
}
【4】、@Component(组件存储)
@Component
public class UserComponent {public void func4() {System.out.println("func4");}
}
class App {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");UserComponent userComponent =context.getBean("userComponent",UserComponent.class);userComponent.func4();}
}
【5】、@Configuration(配置存储)
@Configuration
public class UserConfiguration {public void func5() {System.out.println("func5");}
}
class App {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");UserConfiguration userConfiguration=context.getBean("userConfiguration",UserConfiguration.class);userConfiguration.func5();}
}
(2)、方法注解@Bean
在Spring框架的设计中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器中。
@Component
public class Users {@Beanpublic User user1() {User user = new User();user.setName("张三");return user;}
}
3、重命名Bean
可以通过设置name属性给Bean对象进行重命名操作,此时我们使用user1就可以获取到User对象。
@Component
public class Users {@Bean(name = "user1")public User user() {User user = new User();user.setName("张三");return user;}
}
这个重命名的name是⼀个数组,因此一个bean可以有多个名字,并且name={}也可以省略。
@Bean({"user1", "user2"})
public User user() {User user = new User();user.setName("张三");return user;
}
二、获取Bean对象
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊。
对象装配(对象注⼊)的实现⽅法以下 3 种:属性注⼊、Setter 注⼊、构造⽅法注⼊
1、注入关键字@Autowired
(1)、属性注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {@Autowiredprivate UserService userService;public void show() {System.out.println(userService.name)}
}
- 优点:使用简洁方便
- 缺点:只能用于 IoC 容器,非 IoC 容器不可用;无法注入被 final 修饰的对象;容易违背单一性原则
(2)、Setter注入
Setter注入和属性的Setter方法类似,但在设置set方法时需要加上@Autowired的注解。
@Controller
public class UserController {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void show() {System.out.println(userService.name)}
}
- 优点:不容易违背单一性原则
- 缺点:通用性不如构造方法;无法注入被final修饰的对象;容易被非法调用
(3)、构造方法注入
构造方法注入是在类的构造方法中实现注入的。如果只有一个构造方法,那么@Autowired注解可以省略,但如果类中有多个构造方法,那么需要添加上@Autowired来明确指定到底使用哪个构造方法,否则程序会报错。
@Controller
public class UserController {private UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public void show() {System.out.println(userService.name)}
}
- 优点:构造器是Spring推荐的注入方式,同时构造器注入的通用性较强,能够注入被final修饰的对象
- 缺点:使用复杂
2、注入关键字@Resource
在进行类注入时除了可以使用@Autowired关键字之外,还可以使用@Resource进行注入。
@Controller
public class UserController {@Resourceprivate UserService userService;public void show() {System.out.println(userService.name)}
}
3、@Autowired和@Resource的区别
- 出身不同:@Autowired 来自于Spring;@Resource 来自于JDK的注解;
- 设置参数不同:相比于@Autowired,@Resource支持更多的参数设置;
- 注入种类不同:@Autowired可用于属性注入、Setter注入和构造函数注入;@Resource只能用于属性注入和Setter注入,不能与于构造函数注入;
4、解决同一类型多个@Bean报错
@Component
public class Users {@Beanpublic User user1() {User user = new User();user.setName("张三");return user;}@Beanpublic User user2() {User user = new User();user.setName("李四");return user;}
}
报错的原因是非唯一的Bean对象,解决同一个类型的多个bean的解决方案有以下两个
(1)、使用 @Resource 注解
@Controller
class UserController4 {@Resource(name = "user1")private User user;public User getUser() {return user;}
}
(2)、使用 @Qualifier 注解
@Controller
public class UserController5 {@Autowired@Qualifier(value = "user2")private User user;public User getUser() {return user;}
}