簡體   English   中英

@Autowired和@Service在控制器上工作,但不是從不同的包中工作

[英]@Autowired and @Service working from controller but not from a different package

我需要幫助理解@Autowired@Service背后的概念。 我有一個使用@Service@Autowired控制器定義的DAO,一切似乎都很好,但是,我在不同的類中使用相同的@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
    }
}

彈簧配置:

<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>

這是因為您的POJO類不是由spring容器管理的。

@Autowire注釋僅適用於由spring管理的對象(即由spring容器創建)。

在您的情況下,服務和控制器對象由spring管理,但您的POJO類不由spring管理,這就是為什么@Autowire不會產生您期望的行為。

我注意到的另一個問題是,當spring具有專門為此目的創建的@Repository注釋時,您在DAO層中使用@Service注釋。

另外,不希望允許spring管理POJO類,因為通常它將是必須在容器外部創建的數據存儲元件。

您能告訴我們POJO類的目的是什么以及為什么使用service實例?

使用類路徑掃描時,您必須與Spring通信要管理的類。 這是使用@Service注釋及其關系( @Controller@Repository等)完成的。

如果您選擇注釋bean,則必須在配置中顯式聲明它,就像使用dataSourcejdbcTemplate

注釋您的類意味着只有包中的那些類由Spring管理; 它允許您掃描包而無需管理該包中的所有類。

將其包含在applicationContext.xml文件中

<context:annotation-config />

您可以實現此操作以在POJO類中使用spring-managed bean。

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

檢查配置文件中的上下文組件掃描

<context:component-scan base-package="<your_package>" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM