Spring如何在Java应用程序中自动实现依赖注入?

liulianxi 2010-04-10 03:32:52
最近开发一个Java应用程序,希望能使用Spring来实现依赖注入。

在Web应用程序中,可以在web.xml文件中配置listener来自动实现注入。

在Java Application中,可以通过如下的方式来加载Spring:
ClassPathXmlApplicationContext ctx = new FileSystemXMLApplicationContext("beans.xml");
Hello hello = ctx.getBeans("hello");

但这样的一个问题是,在每次使用一个bean时,都需要显示调用一次getBeans。

不知有什么好的方法,能够让Spring自动加载对象,而不需要显式调用getBeans?
...全文
334 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cb135456 2010-04-10
  • 打赏
  • 举报
回复
这是我SSH框架集成的配置文件 楼主可以参考一下,
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">


<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/oa"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- <prop key="hibernate.hbm.auto2ddl">create</prop>-->
</props>
</property>
<property name="mappingResources">
<list>
<value>com/demo/po/EmployeePo.hbm.xml</value>
</list>
</property>
</bean>
<bean id="employeedao" class="com.demo.dao.impl.EmployeeDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!--另外在你注入的那个类里写一个Set方法
比如说这样
private EmployeeServiceImpl EmployeeServiceImpl;
public void SetEmployeeServiceImpl(EmployeeServiceImpl EmployeeServiceImpl)
{
this.EmployeeServiceImpl =EmployeeServiceImpl ;
}

-->
<bean id="employeeservice" class="com.demo.service.impl.EmployeeServiceImpl">
<property name="employeeDao" ref="employeedao"></property>
</bean>
<bean name="/con" class="com.demo.action.ControlAction">
<property name="projectbiz" ref="employeeservice"></property>
</bean>
</beans>
xieyu_zy 2010-04-10
  • 打赏
  • 举报
回复
楼上方法很好,其实JAVA就是一种面向对象不断抽象对象和类的东西,对于公共的实现,我们肯定是抽出来做,只是我不明白你为什么说,要getBean一次,难道你这也不想写,我先说一下对于这类公共的方法,如果是模板化的,我们也推荐另一种做法,然后再说getBean的问题,我们推荐是继承,你在父亲方法类内部需要写出如下方法(不好意思,楼上抄写你一段代码,只是写在父亲类,不使用static而已):
public Object getBeanObject(String xmlName,String className){
ClassPathXmlApplicationContext ctx = new FileSystemXMLApplicationContext(xmlName);
Object obj = ctx.getBeans(className);
return obj;
}
此时所有的类似实现类我们都extends这类,在这个类的实例调用中,所有方法都可以享受这样的调用,就可以直接使用:
Hello hello = (Hello)getBeanObject("beans.xml","hello");


但是你说你要自动注入hello是吗?那么这个可以,但是需要你当前类也要进行Spring的反射内部,因为只有实体内部的变量才会被赋值,否则要从第三方去获取,此时将当前类也用Spring配置后,将hello作为赋值对象进行配置,并在当前类内部定义:
private Hello hello;
并对应其set方法,而get方法根据实际情况定是否需要。
此时配置文件需要设置:
<bean id="testService" class="当前类的全名">
<property name="hello">
<ref bean="hello"/>
</property>
</bean>

配置了这些,当前类就应该可以反射成功了,但是注意,某些情况下不能这样做,在struts内部一般action层我们要么不会去反射,要门用Spring托管,一般业务层才开始这样写,因为action调用业务层是使用上述方法的。
此时若反射成功,在该实体(一定是当前实体)就可以直接使用hello对象了。

  • 打赏
  • 举报
回复
spring的容器时beanFactory,当你把beans.xml载入容器后,getBean是用来获取问候服务的引用,你用到spring,就是要用他的注入,你只需要获取服务的引用就可以

你如果想不反复的调用,你可以写个工具类,给一个string类,返回一个object类,也是可以的,如:
public class TestUtil{
public static Object getBeanObject(String xmlName,String className){
ClassPathXmlApplicationContext ctx = new FileSystemXMLApplicationContext(xmlName);
Object obj = ctx.getBeans(className);
return obj;
}
}
以后你要使用的时候,输入xmlName,className就可以得到,你做个强转就可以了:
像你上面的
可以写成 Hello hello=(Hello)TestUtil.getBeanObject("beans.xml",hello);
上面的例子我也没测试过,你看看能不能用

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧