10

@Autowiredとの背後にある概念を理解するのに助けが必要@Serviceです。DAOをで定義し@Service、コントローラーをで定義していて@Autowired、すべてが正常に見えますが@Autowired、別のクラスで同じものを使用すると、機能しません。

例:

サービス

@Service
public class MyService {
    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void setDataSource (DataSource myDataSource) {
        this.jdbcTemplate = new JdbcTemplate(myDataSource);
    } 

    public void testUpdate(){
            jdbcTemplate.update("some query");
    }
}

コントローラ

package com.springtest.mywork.controller;

@Controller
@RequestMapping(value = "/test.html")
public class MyController
{
  @Autowired
  MyService myService;

  @RequestMapping(method = RequestMethod.GET)
  public String test(Model model)
  {
    systemsService.testUpdate();
    return "view/test";
  }
}

上記はすべて正常に動作します。ただし、POJOで使用したい場合はMyService、機能しません。例:

package com.springtest.mywork.pojos;
public class MyPojo {

    @Autowired
    MyService myService;

    public void testFromPojo () {
        myService.someDataAccessMethod(); //myService is still null
    }
}

Spring Config:

<beans>
    <mvc:annotation-driven />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <context:component-scan base-package="com.springtest.mywork" />
    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb" />
        <property name="username" value="hello" />
        <property name="password" value="what" />
    </bean>

    <bean name="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
        <constructor-arg ref="dataSource"/>
    </bean>
 </beans>
4

5 に答える 5

16

これは、POJOクラスがSpringコンテナによって管理されていないためです。

@Autowireアノテーションは、Springによって管理されている(つまり、Springコンテナによって作成された)オブジェクトのみを機能させます。

あなたの場合、サービスとコントローラーオブジェクトはSpringによって管理されていますが、POJOクラスはSpringによって管理されてい@Autowireないため、は期待どおりの動作を生成していません。

私が気付いたもう1つの問題は、Springにこの目的のために特別に作成され@Serviceたアノテーションがある場合に、DAOレイヤーでアノテーションを使用していることです。@Repository

また、通常はコンテナの外部で作成する必要があるのはデータストレージ要素であるため、SpringがPOJOクラスを管理できるようにすることは望ましくありません。

于 2012-10-12T15:47:40.550 に答える
5

クラスパススキャンを使用する場合、管理するクラスをSpringに通知する必要があります。これは、@Service注釈とその関係(、、@Controllerなど@Repository)を使用して行われます。

Beanにアノテーションを付けないことを選択した場合は、 dataSourceandで行ったのと同じように、構成で明示的に宣言する必要がありますjdbcTemplate

クラスにアノテーションを付けるということは、パッケージ内のそれらのクラスのみがSpringによって管理されることを意味します。これにより、パッケージ内のすべてのクラスを管理しなくても、パッケージをスキャンできます。

于 2012-10-12T15:32:44.053 に答える
2

これをapplicationContext.xmlファイルに含めます

<context:annotation-config />
于 2012-10-12T15:32:14.610 に答える
0

これを実装して、POJOクラスでスプリング管理されたBeanを使用できます。

http://www.javacodegeeks.com/2015/03/using-spring-managed-bean-in-non-managed-object.html

于 2015-10-08T08:09:43.183 に答える
-1

構成ファイルでコンテキストコンポーネントスキャンを確認してください

<context:component-scan base-package="<your_package>" />
于 2012-10-12T15:22:44.583 に答える