Spring注入需要注意的地方

一、配置文件注入

在applicationContext.xml中配置:

    <bean name="c" class="pojo.Category">
        <property name="name" value="category 1" />
    </bean>

当程序运行到

        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml" });

时,Spring会自动调用Category的构造方法,创建一个Category的实例化对象,变量名为c,并且初始化c的所有属性为默认属性,int id=0,String name=null。然后根据<property name="name" value="category 1" />,调用Category的setName()方法,将name赋值为"category 1"。所以,综上,如果Category中没有提供setName()方法,那么配置文件中的<property name="name" value="category 1" />这一行将会报错:

Invalid property 'name' of bean class [pojo.Category]: Bean property 'name' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

属性无法被注入。

假如Category并没有name属性,但是提供了setName()方法,配置文件中的<property name="name" value="category 1" />这一行并不会报错,它仍旧会找到setName()方法并执行。另外,setName()必须要有参数。

以上是对字符串属性的注入解释,同理,对象的注入也是如此。假如Category类中有属性product对象,那么如果想要在配置文件中注入product对象,也必须提供setProduct()方法。

 

二、注解注入

上面的方式是通过配置文件调用setter方法注入属性的,还有一种方式是通过@Autowired注入属性。@Autowired的位置可以在属性前面,也可以在setter方法前。那么当@Autowired放在属性前面,可以没有该属性的Setter方法么?答案是可以的。那@Autowired是如何注入属性的呢?答案是利用反射。首先,当使用@Autowired会导致Spring去遍历所管理的对象,也就是applicationContext.xml中有的bean或者是@Componet声明的bean,看哪个对象类型是@Autowired注解的属性类型,然后将该bean注入到@Autowired注解的属性中。但是它没有Setter方法,是如何注入的呢?那么就用到万能的反射了。因为反射为属性设置值是不需要提供setter方法的。

 

注入某变量的对象属性无论利用注解还是配置文件,前提都是要spring已经管理了这个对象,即这个对象已经被注解(@Component、@Repository、@Service等)或已经被配置文件加入了bean。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值