Как предоставить значение параметра для автопереключаемой переменной?

Я хочу автоматически связать переменную:

package com.ambre.hib.dao;

public interface LangDAO {

    public String _getText();

}

package com.ambre.hib.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;

public class LangDAOImpl implements LangDAO {

    @Autowired
    private Environment env;

    private String code;

    public LangDAOImpl() {

    }

    public LangDAOImpl(String code) {
        this.code = code;
    }

    @Override
    public String _getText() {
        return env.getProperty(code);
    }

}

package com.ambre.hib.config;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import com.ambre.hib.dao.LangDAO;
import com.ambre.hib.dao.LangDAOImpl;
import com.ambre.hib.dao.UserDAO;
import com.ambre.hib.dao.UserDAOImpl;
import com.ambre.hib.model.User;

@Configuration
@ComponentScan("com.ambre.hib")
@EnableTransactionManagement
@PropertySource("classpath:lang.properties")
public class ApplicationContextConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer properties() { // managing properties file ( languages )
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    @Bean(name = "dataSource")
    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
        dataSource.setUsername("system");
        dataSource.setPassword("a");

        return dataSource;
    }

    @Autowired
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(DataSource dataSource) {

        LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);

        sessionBuilder.addAnnotatedClasses(User.class);

        return sessionBuilder.buildSessionFactory();
    }

    @Autowired
    @Bean(name = "transactionManager")
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {

        HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);

        return transactionManager;
    }

    @Autowired
    @Bean(name = "userDao")
    public UserDAO getUserDao(SessionFactory sessionFactory) {
        return new UserDAOImpl(sessionFactory);
    }

    @Autowired
    @Bean(name = "langDAO")
    public LangDAO getLangDAO(String code) {
        return new LangDAOImpl(code);
    }

}

package com.ambre.hib.controller;

... // imports

@Controller
public class HomeController {

    @Autowired
    private LangDAO langDAO; // how to set here the String "title.home" to the constructor ?

    @RequestMapping("/")
    public String handleRequest(Model model) throws Exception {

        model.addAttribute("titre", langDAO._getText());
        return "UserList";
    }

}

Как видите, я автоматически подключил класс LangDAO в контроллере. Но я хочу передать String в качестве параметра конструктора. Как это сделать?

2 ответа

Поскольку я вижу, что вы уже настроили PropertySourcesPlaceholderConfigurer, вы можете автоматически связать свойство из файла конфигурации непосредственно с конструктором, например так:

@Autowired
public LangDAOImpl(@Value("${you_property_key}") String code) {
        this.code = code;
    }

или прямо на имущество

@Value("${you_property_key}") String code

В качестве альтернативы, если вы определяете метод @PostConstruct, вы можете получить свойство из среды и установить его самостоятельно.

Значения могут быть автоматически подключены несколькими способами

  1. Spring предоставляет функцию автоматического подключения свойств системы.

    @Value ("$ {pool.size}") public String size;

  2. Использование весеннего контекста приложения для передачи значений

    <bean id="textEditor" class="com.tutorialspoint.TextEditor">     
         <constructor-arg  value="${property.from.file}"/>
    </bean>
    

Свойства будут загружены в память с помощью

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:service.properties</value>
        </property>
    </bean>

ссылка: http://www.tutorialspoint.com/spring/spring_autowiring_byconstructor.htm

Другие вопросы по тегам