博客主页:准Java全栈开发工程师
00年出生,即将进入职场闯荡,目标赚钱,可能会有人觉得我格局小、觉得俗,但不得不承认这个世界已经不再是以一条线来分割的平面,而是围绕财富旋转的球面,成为有钱人不是为了去掌控球体的转向,而是当有人恶意掌控时,努力保护好家人和自己。
public interface BeanDao {
public void save();
}
public class BeanDaoImpl implements BeanDao {
public void save() {
System.out.println("beanDao save...");
}
}
public interface BeanService {
public void save();
}
public class BeanServiceImpl implements BeanService {
private BeanDao beanDao;
public void setBeanDao(BeanDao beanDao) {
this.beanDao = beanDao;
}
public void save() {
System.out.println(" bean service save...");
beanDao.save();
}
}
<bean id="beanDao" class="dao.impl.BeanDaoImpl"/>
<bean id="beanService" class="service.impl.BeanServiceImpl">
<property name="beanDao" ref="beanDao" />
bean>
public class App {
public static void main(String[] args) {
// 加载配置文件,获得上下文对象
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanService beanService = (BeanService) context.getBean("beanService");
beanService.save();
}
}
bean service save...
beanDao save...
public interface BeanDao {
public void save();
}
public class BeanDaoImpl implements BeanDao {
private String name;
private Integer age;
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void save() {
System.out.println("beanDao save...");
System.out.println("name : " + name + " , age : " + age);
}
}
<bean id="beanDao" class="dao.impl.BeanDaoImpl">
<property name="name" value="qdxorigin"/>
<property name="age" value="22"/>
</bean>
public class App {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanDao beanDao = (BeanDao) context.getBean("beanDao");
beanDao.save();
}
}
beanDao save...
name : qdxorigin , age : 22
注入信息能够正确输出。
public interface BeanDao {
public void save();
}
public class BeanDaoImpl implements BeanDao {
public void save() {
System.out.println("beanDao save...");
}
}
public interface BeanService {
public void save();
}
public class BeanServiceImpl implements BeanService {
private BeanDao beanDao;
public BeanServiceImpl(BeanDao beanDao) {
this.beanDao = beanDao;
}
public void save() {
System.out.println("bean service save...");
beanDao.save();
}
}
<bean id="beanDao" class="dao.impl.BeanDaoImpl"/>
<bean id="beanService" class="service.impl.BeanServiceImpl">
<constructor-arg name="beanDao" ref="beanDao"/>
</bean>
public class App {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanService beanService = (BeanService) context.getBean("beanService");
beanService.save();
}
}
bean service save...
beanDao save...
为了解决上述问题,提出了可以使用”type“属性来解决参数名耦合高的问题。
<constructor-arg type="dao.BeanDao" ref="beanDao"/>
在构造器注入时,不使用”name“属性指定具体的名字,而是改用”type"属性指定类型,通过类型匹配来完成赋值。
虽然该方式解决了参数名问题,但是如果构造器方法的形参列表中有多个相同类型的参数呢?这时应该如何完成赋值呢?谁赋值给谁又有了新的问题。
为了解决这个问题,又提出了使用“index”属性。
<constructor-arg index="0" ref="beanDao"/>
干脆直接使用“index”属性指定下标来进行赋值,这种方式虽然解决了相同类型参数的赋值问题,但是如果构造方法的形参列表中的参数顺序改变了呢?是不是又得来修改“index”属性的值呢?
所以,这也是为什么在“注入方式的选择”内容中,推荐使用setter方式注入的原因。
以上就是文章的全部内容啦,诸佬如果有任何建议都可以提哦。
创作不易,如果觉得对您有帮助的话,欢迎关注✨点赞收藏哦。