关于注解的bean管理方式的一些疑问

关于注解的bean管理方式的一些疑问

这是老师上课的例子

package com.imooc.demo3;

public class CategoryDao {

   public void save(){
       System.out.println("CategoryDao的save方法执行了。。。。");
   }
}
package com.imooc.demo3;

public class ProductDao {

   public void save(){
       System.out.println("ProductDao的save方法执行了。。。。");
   }
}
package com.imooc.demo3;

import org.springframework.stereotype.Component;

import javax.annotation.Resource;

public class ProductService {
   @Resource(name = "categoryDao")
   private CategoryDao categoryDao;
   @Resource(name = "productDao")
   private ProductDao productDao;


   public void save(){
       System.out.println("ProductService的save方法执行了。。。。");
       categoryDao.save();
       productDao.save();
   }
}
package com.imooc.demo3;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo3 {
   @Test
   public void demo1(){
       ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
      ProductService productService=(ProductService) applicationContext.getBean("productService");
      productService.save();
   }
}
<context:annotation-config/>
   <bean id="productService" class="com.imooc.demo3.ProductService"></bean>

   <bean id="categoryDao" class="com.imooc.demo3.CategoryDao"></bean>
   <bean id="productDao" class="com.imooc.demo3.ProductDao"></bean>

我的问题就是在使用了

@Resource(name = "categoryDao")

   private CategoryDao categoryDao;

之后categoryDao就可以调用save方法,而如果我在ProductService这个类前面加@Resourc为什么就不可以在测试类中直接调用他的save方法,却要通过applicaContext来读取xml文件之后才可以用save方法

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,在测试类中如果没有创建ApplicationContext对象,使用Spring容器管理Bean,那么用注入的方式获得到的对象是空的。在xml开了自动扫描,但运行测试方法需要加载xml文件,告诉程序要初始化Spring容器。否则ProductService类中的categoryDao和productDao属性为null。

例如不加载xml文件,如下:

http://img1.sycdn.imooc.com//climg/5f3d08c609c895cf09010240.jpg

运行效果如下:

http://img1.sycdn.imooc.com//climg/5f3d094709d5717708170464.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕珊 2020-08-17 19:21:59

同学,你好!Bean是定义到配置文件中的,所以要加载配置文件才能找到Bean。如果想在测试类中也使用到bean,可以按如下方式,注意红框圈起来的内容是用注解来配置Spring测试环境并加载配置文件,这些配置好以后才能使用@Resource注解。这个是Spring AOP部分介绍的内容,同学可以回顾一下。

http://img1.sycdn.imooc.com//climg/5f3a679c09a903be05550533.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕标0359786 #1
    我们都是在xml开了自动扫描,为什么@Resource(name = "categoryDao") private CategoryDao categoryDao;可以直接调用 categoryDao的方法而不需要加载配置文件,而ProductService就需要加载配置文件。
    2020-08-19 15:55:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师