如何在主程序中使用构造函数注入
How to use constructor injection in a main program
我的问题很简单:
使用构造函数注入,我如何才能获得在 class ClassB 中声明为属性的 class ClassA 的属性,知道 ClassA 只有一个构造函数(没有 setter 和 getter)?
这里我将写下我的 java 代码:
A 类:
public class ClassA {
public int x1;
public String x2;
ClassA(int x1, String x2) {
this.x1 = x1;
this.x2 = x2;
}
}
B 类:
public class ClassB {
private ClassA a;
private String y1;
private String y2;
public ClassA getA() {
return a;
}
public void setA(Class a) {
this.a = a;
}
public String getY1() {
return y1;
}
public void setY1(String y1) {
this.y1 = y1;
}
public String getY2() {
return y2;
}
public void setY2(String y2) {
this.y2 = y2;
}
}
主程序:
public class ConstructorInjection {
public static void main(String args[]){
Resource xmlResource = new FileSystemResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(xmlResource);
ClassB b= (ClassB)factory.getBean("bBean");
ClassA a= b.getA();
System.out.println("y1="+b.getY1);
System.out.println("y2="+b.getY2);
System.out.println("x1="+a.x1);
System.out.println("x2="+a.x2);
}
}
这是练习构造函数注入的正确例子吗?
Xml配置:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="bBean" class="javabeat.net.spring.ioc.ClassB">
<property name="y1" value="expy1" />
<property name="y2" value="expy2" />
<property name="a" ref="aBean" />
</bean>
<bean id="aBean" class="javabeat.net.spring.ioc.ClassA">
<constructor-arg name="x1" type="java.lang.int" value="0"/>
<constructor-arg name="x2" type="java.lang.String" value="exp"/>
</bean>
</beans>
这部分是困扰我的地方:
System.out.println("x1="+a.x1);
System.out.println("x2="+a.x2);
不确定这是否是获取 ClassA 属性的正确方法!
我读过构造函数注入强制属性的初始化,但是在哪里?在 xml 配置中?还是在主程序中?
非常感谢你:)
关于您对以下问题的担忧:
System.out.println("x1="+a.x1); System.out.println("x2="+a.x2);
x1 和x2 都是私有变量,因此您将无法像以前那样使用a.x1 或a.x2。 x1 和 x2 需要 public getter。没有看到你的application.xml,很难再多说什么了。请给出一些代码,可以是 运行.
将你的applicationContext.xml中的aBean修改为
<bean id="aBean" class="javabeat.net.spring.ioc.ClassA">
<constructor-arg name="x1" type="int" value="0"/>
<constructor-arg name="x2" type="java.lang.String" value="exp"/>
</bean>
我的问题很简单: 使用构造函数注入,我如何才能获得在 class ClassB 中声明为属性的 class ClassA 的属性,知道 ClassA 只有一个构造函数(没有 setter 和 getter)?
这里我将写下我的 java 代码:
A 类:
public class ClassA {
public int x1;
public String x2;
ClassA(int x1, String x2) {
this.x1 = x1;
this.x2 = x2;
}
}
B 类:
public class ClassB {
private ClassA a;
private String y1;
private String y2;
public ClassA getA() {
return a;
}
public void setA(Class a) {
this.a = a;
}
public String getY1() {
return y1;
}
public void setY1(String y1) {
this.y1 = y1;
}
public String getY2() {
return y2;
}
public void setY2(String y2) {
this.y2 = y2;
}
}
主程序:
public class ConstructorInjection {
public static void main(String args[]){
Resource xmlResource = new FileSystemResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(xmlResource);
ClassB b= (ClassB)factory.getBean("bBean");
ClassA a= b.getA();
System.out.println("y1="+b.getY1);
System.out.println("y2="+b.getY2);
System.out.println("x1="+a.x1);
System.out.println("x2="+a.x2);
}
}
这是练习构造函数注入的正确例子吗?
Xml配置:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="bBean" class="javabeat.net.spring.ioc.ClassB">
<property name="y1" value="expy1" />
<property name="y2" value="expy2" />
<property name="a" ref="aBean" />
</bean>
<bean id="aBean" class="javabeat.net.spring.ioc.ClassA">
<constructor-arg name="x1" type="java.lang.int" value="0"/>
<constructor-arg name="x2" type="java.lang.String" value="exp"/>
</bean>
</beans>
这部分是困扰我的地方:
System.out.println("x1="+a.x1);
System.out.println("x2="+a.x2);
不确定这是否是获取 ClassA 属性的正确方法! 我读过构造函数注入强制属性的初始化,但是在哪里?在 xml 配置中?还是在主程序中?
非常感谢你:)
关于您对以下问题的担忧:
System.out.println("x1="+a.x1); System.out.println("x2="+a.x2);
x1 和x2 都是私有变量,因此您将无法像以前那样使用a.x1 或a.x2。 x1 和 x2 需要 public getter。没有看到你的application.xml,很难再多说什么了。请给出一些代码,可以是 运行.
将你的applicationContext.xml中的aBean修改为
<bean id="aBean" class="javabeat.net.spring.ioc.ClassA">
<constructor-arg name="x1" type="int" value="0"/>
<constructor-arg name="x2" type="java.lang.String" value="exp"/>
</bean>