目录
存储Bean对象
将对象存储在 Spring 中,有两种注解类型可以实现:
- 类注解:@Controller、@Service、@Repository、@Component、@Configuration
- 方法注解:@Bean
@Controller(控制器存储)
如下使用@Controller存储Bean代码:
@ControllerpublicclassUserController{publicvoidSayHi(String name){System.out.println("你好"+name);}}
使用获取上下文的方法获取上面存储的对象
publicclassTest{publicstaticvoidmain(String[] args){//获取spring上下文ApplicationContext applicationContext =newClassPathXmlApplicationContext("spring-config.xml");//获取指定的Bean对象名称+类型进行获取UserController userController =(UserController) applicationContext.getBean("userController");userController.SayHi("zcx");}}
效果为
@Service(服务存储)
如下使用@Service存储Bean代码:
@ServicepublicclassUserService{publicvoidSayHi(String name){System.out.println("你好"+name);}}
输出结果跟@Controller一样
@Repository(仓库存储)
如下使用@Repository存储Bean代码:
@RepositorypublicclassUserRepository{publicvoidSayHi(String name){System.out.println("你好"+name);}}
@Component(组件存储)
如下使用@Component存储Bean代码:
@ComponentpublicclassUserComponent{publicvoidSayHi(String name){System.out.println("你好"+name);}}
@Configuration(配置存储)
如下使用@Configuration存储Bean代码:
@ConfigurationpublicclassUserConfiguration{publicvoidSayHi(String name){System.out.println("你好"+name);}}
需要这么多类注解是让程序员看到类注解之后,就能直接了解当前类
的⽤途,比如:
- @Controller:表示的是业务逻辑层
- @Servie:表示的是服务层
- @Repository:表示的是持久层
- @Configuration:表示的是配置层
Bean
⽅法注解是放到某个⽅法上的要配合类注解使⽤,如以下代码的实现:
@ControllerpublicclassUsers{@BeanpublicUseruser1(){User user =newUser();return user;}}
publicclassTest{publicstaticvoidmain(String[] args){//获取spring上下文ApplicationContext applicationContext =newClassPathXmlApplicationContext("spring-config.xml");//获取指定的Bean对象名称+类型进行获取User user =(User) applicationContext.getBean("user1");
user.sayHi("zcx");}}
user类
@ComponentpublicclassUser{publicvoidsayHi(String name){System.out.println(name+"你好");}}
结果
重命名Bean
可通过设置 name 属性给 Bean 对象进⾏重命名操作
@Bean(name ={"u1","us1"})publicUseruser1(){User user =newUser();return user;}
或者
@Bean(name ={"u1","us1"})publicUseruser1(){User user =newUser();return user;}
获取Bean对象
获取Bean对象就是把对象取出来放入某个类中,也叫对象注入或者对象装配。
对象注入有三种实现方法:
- 属性注⼊
- 构造⽅法注⼊
- Setter 注⼊
下⾯我们按照实际开发中的模式,将 Service 类注⼊到 Controller 类中
属性注入
属性注⼊是使⽤ @Autowired 实现的,实现代码如下:
@ServicepublicclassUserService{publicUseruser1(){User user =newUser();return user;}}
@ControllerpublicclassUserController{@AutowiredprivateUserService userService;publicUsergetUser(){return userService.user1();}}
publicclassTest{publicstaticvoidmain(String[] args){//获取spring上下文ApplicationContext applicationContext =newClassPathXmlApplicationContext("spring-config.xml");//获取指定的Bean对象名称+类型进行获取UserController userController = applicationContext.getBean(UserController.class);
userController.getUser().sayHi("zcx");}}
构造方法注入
构造⽅法注⼊是在类的构造⽅法中实现注⼊,实现代码如下:
@ControllerpublicclassUserController{privateUserService userService;@AutowiredpublicUserController(UserService userService){this.userService = userService;}publicUsergetUser(){return userService.user1();}}
其余代码写法跟属性注入一样
Setter注入
在设置 set ⽅法的时候需要加上 @Autowired 注解
@ControllerpublicclassUserController{privateUserService userService;@AutowiredpublicvoidSetUserController(UserService userService){this.userService = userService;}publicUsergetUser(){return userService.user1();}}
@Resource(注入关键字)
@ControllerpublicclassUserController{@ResourceprivateUserService userService;publicUsergetUser(){return userService.user1();}}
使用@Resource 可以解决同⼀类型多个 Bean 报错问题
可以如下设置方法名
@Resource(name ="user1")
@Autowired 和 @Resource 的区别
- 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解
- 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name 设置,根据名称获取 Bean
- @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊
版权归原作者 手插口袋谁也不爱♡ 所有, 如有侵权,请联系我们删除。