spring注入时bean的set方法为什么不能是static类型的?

静态方法是属于类(class)的,普通方法才是属于实体对象(也就是New出来的对象)的,spring注入是在容器中实例化对象,所以不能使用静态方法
 
 
在springframework里,我们不能@Autowired一个静态变量,使之成为一个spring bean,例如下面这样:
[java] 
  1. @Autowired  
  2. private static YourClass yourClass;  


可以试一下,yourClass在这种状态下不能够被依赖注入,会抛出运行时异常java.lang.NullPointerException,为什么呢?静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入.

而使用静态变量/类变量扩大了静态方法的使用范围.静态方法在spring是不推荐使用的.依赖注入的主要目的,是让容器去产生一个对象的实例,然后在整个生命周期中使用他们,同时也让testing工作更加容易.

一旦你使用静态方法,就不再需要去产生这个类的实例,这会让testing变得更加困难,同时你也不能为一个给定的类,依靠注入方式去产生多个具有不同的依赖环境的实例.这种static field是隐含共享的,并且是一种global全局状态,spring同样不推荐这样去做.

转载于:https://www.cnblogs.com/CrisZjie180228/p/8979598.html

依赖注入(Dependency Injection,DI)是一种设计模式,它可以将对象之间的依赖关系从代码移除出来,从而提高代码的可读性、可维护性和可测试性。其的一种实现方式就是 setter 注入。下面是一个使用 setter 注入的示例,创建一个学生类,配置 bean 为属性赋值,并输出某个学生的信息: 首先,创建一个 `Student` 类,包含 `id`、`name` 和 `age` 三个属性: ```java public class Student { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` 然后,在 Spring 的配置文件,配置一个 `Student` 的 bean,并为其属性赋值: ```xml <bean id="student" class="com.example.Student"> <property name="id" value="1" /> <property name="name" value="Tom" /> <property name="age" value="18" /> </bean> ``` 最后,编写一个测试类,获取配置的 `Student` bean,输出其属性值: ```java public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student student = (Student) context.getBean("student"); System.out.println("id: " + student.getId()); System.out.println("name: " + student.getName()); System.out.println("age: " + student.getAge()); } } ``` 运行测试类,输出结果如下: ``` id: 1 name: Tom age: 18 ``` 这样就完成了一个使用 setter 注入的示例,通过配置文件为 `Student` 类的属性赋值,然后从容器获取 `Student` bean,输出其属性值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值