我正在开发Spring依赖注入。
我想使用spring计算矩形和圆的面积并使用依赖注入。
直到现在我已经完成了这个:
接口
public interface Shape {
double calculateArea();
}
圈子类
public class Circle implements Shape{
@Autowired
public double radius;
@Override
public double calculateArea() {
double area = (Math.PI)*radius*radius;
return area;
}
}
矩形类:
public class Rectangle implements Shape {
@Autowired
public double length;
@Autowired
public double breadth;
@Override
public double calculateArea() {
double area = length*breadth;
return area;
}
}
bean xml:
<bean id="circle" class="org.package.test.Circle">
<property name="radius" value="12"/>
</bean>
<bean id="rectangle" class="org.package.test.Rectangle">
<property name="length" value="12"/>
<property name="breadth" value="10"/>
</bean>
<bean id="geometricalShape" class="org.package.test.GeometricalShape">
<constructor-arg ref="circle"/>
<constructor-arg ref="rectangle"/>
</bean>
GeometricalShape.java
private Shape shape;
private Shape shape1;
/**
* Inject circle object via Constructor
*/
public GeometricalShape(Shape shape,Shape shape1) {
this.shape = shape;
this.shape1 = shape1;
}
public void calculate() {
shape.calculateArea();
shape1.calculateArea();
}
}
Main.Java
public class Main {
public static void main(String[] args) {
@SuppressWarnings("resource")
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
GeometricalShape bean1=context.getBean("geometricalShape", GeometricalShape.class);
geometryBean1.calculate();
}
}
这里我直接提供半径/长度或宽度作为静态值。我如何将其作为动态值提供(这是我想要的任何值,在Spring中更改它?)有没有更好的方法使用Spring依赖注入?有什么建议吗?
答案 0 :(得分:0)
您正尝试将标量值自动装入Circle
和Rectangle
类。这不行。正确的解决方案是使用Spring的 @Value 注释,该注释将由BeanPostProcessor执行并为您注入。
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:config.properties</value>
</list>
</property>
<property name="properties">
<value>
circle.radius=12
rectangle.length=12
rectangle.breadth=10
</value>
</property>
</bean>
然后你可以做的是:
public class Circle implements Shape{
@Value("#{circle.radius}")
public double radius;
@Override
public double calculateArea() {
double area = (Math.PI)*radius*radius;
return area;
}
}
甚至在你的bean定义中你可以像这样定义它
<bean id="circle" class="org.package.test.Circle">
<property name="radius" value="#{circle.radius}"/>
</bean>
您可以在我的示例中看到PropertyPlaceholderConfigurer
也具有locations
属性,因此您可以将此值移动到文件中。 Spring也可以从Environment变量或System属性中读取它。我建议阅读Spring's reference documentation.