1. Фон
В последнее время, в процессе разработки проекта, я столкнулся с проблемой, которую мне нужно было определить некоторые пользовательские переменные в файле свойств для динамического чтения и изменения переменных программ Java, и больше не нужно для изменения кода. Я воспользовался этой возможностью, чтобы разобраться и проанализировать содержание файла свойств в интегрированном проекте разработки Spring+Springmvc+Mybatis с помощью программ Java и сначала поделился им с вами.
2. Введение среды проекта
Три или пять способов его реализации
Метод 1. Загрузите содержимое в файл конфигурации jdbc.properties через контекст: Property Placeholder
<Контекст: Property Placeholder location = "classpath: jdbc.properties" игнорировать Unresolvable = "true"/>
Приведенная выше конфигурация эквивалентна следующей конфигурации, которая является упрощением следующей конфигурации
<bean id = "propertyconfigurer"> <name = "igenoreUnresolvableplaceholders" value = "true"/> <name = "locations"> <sist> <value> classpath: jdbc.properties </value> </list> </property> </bean>
Примечание. Таким образом, если у вас есть следующая конфигурация в файле Spring-Mvc.xml, вы не должны пропустить следующую красную часть, о ее функции и принципе.
<!-Настройка сканирования компонентов, только аннотации контроллера сканируются в контейнере SpringMVC-> <Контекст: компонент-сканирование Base-package = "com.hafiz.www" use-default-filters = "false"> <context: include filter type = "Annotation" Expression = "org.spramework.steretype.controler"/> compteplor-sceptroler "/> compteplorer"/> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//> <//- compecember-scepentype.
Метод 2. Инъекция с использованием аннотаций, в основном вводя соответствующее значение в файле свойств с использованием аннотаций в коде Java.
<bean id = "prop"> <!- это класс PropertiesFactoryBean. Он также имеет свойство местоположения, которое также получает массив, точно так же, как выше-> <name = "locations"> <Array> <dall> classpath: jdbc.properties </value> </array> </property> </bean>
Метод 3. Используйте тег uTil: свойства, чтобы выявить содержимое в файле свойств
<util: свойства id = "PropertiesReader" location = "classPath: jdbc.properties"/>
Примечание. Используя вышеупомянутую конфигурацию линии, вам необходимо объявить следующую красную часть в заголовке файла Spring-DAO.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-insstance" xmlns: context = "http://wwww.spramemema" xmlns: "http://www.spramema. xmlns: util = "http://www.springframework.org/schema/util" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.spramework.orgem. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-3.2.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd ">
Метод 4. Раскрыть свойства свойствам пользовательского подкласса для использования в программе при загрузке контекста через PropertyplaceholderCurefirer
<bean id = "PropertyConfigurer"> <name = "IgnoreUnresolvable Placeholders" value = "true"/> <property name = "IgnorEresourcenotFound" value = "true"/> <name = "locations"> <Situle> <value> classpath: jdbc.properties </value> </locations> </bean> </beanpath: jdbc.
Объявление пользовательского класса PropertyConfigurer заключается в следующем:
пакет com.hafiz.www.util; import org.springframework.beans.beansexception; import org.springframework.beans.factory.config.configurablelistablebeanfactory; импорт org.springframework.beans.factory.config.propertiplacehlpectoolercerercerercerercer javyl.beans.factory. DESC: Свойства конфигурации. */public Class PropertyConfigurer расширяет PropertyPlaceholderConfigurer {Private Properties Reps; // Доступ к Свойствам конфигурации файла файла результат значения ключа @Override Protected void ProcessProperties (ConfigurableListableBeanFactory BeanFactoryToProcess, Properties) бросает BeanSexception {Super.ProcessProperties (BeanFactoryToprocess, Props); this.props = реквизит; } public String getProperty (String Key) {return this.props.getProperty (key); } public String getProperty (String Key, String defaultValue) {return this.props.getproperty (key, defaultValue); } public Object setProperty (String Key, String Value) {return this.props.setproperty (key, value); }}Как использовать: просто используйте @autowired Annotation Invection в классе, который вам нужно использовать.
Метод 5. Настройте свойство класса инструментов и прочитайте содержимое файла свойств в статическом статическом блоке кода класса и сохраните его в статическом свойстве для использования другими программами.
пакет com.hafiz.www.util; import org.slf4j.logger; import org.slf4j.loggerfactory; import java.io.*; import java.util.properties;/*** desc: desc: descest offerties file class. */public Class PropertyUtil {Private Static Final Logger logger = loggerFactory.getLogger (PropertyUtil.class); частные статические свойства реквизита; static {loadprops (); } Синхронизированный статический private void loadprops () {logger.info ("Содержимое файла нагрузки нагрузку на загрузку ......"); реквизит = новые свойства (); InputStream in = null; try {<!-первый тип, получить поток файлов свойств через класс загрузчик-> in = PropertyUtil.class.getClassLoader (). getResourCeasStream ("jdbc.properties"); <!-Второй тип, получите поток файлов свойств через класс-> // in = PropertyUtil.class.getResourceasStream ("/jdbc.properties"); props.load (in); } catch (filenotfoundexception e) {logger.error ("jdbc.properties file не найден"); } catch (ioException e) {logger.error ("ioException появляется"); } наконец {try {if (null! = in) {in.close (); }} catch (ioException e) {logger.error ("Исключение закрыто с помощью jdbc.properties file -потока закрыто"); }} logger.info ("Загрузка содержимого файла свойств ........."); logger.info ("Свойства файлового содержимого:" + props); } public static String getProperty (String Key) {if (null == props) {loadprops (); } return props.getProperty (key); } public Static String getProperty (String Key, String DefaultValue) {if (null == props) {loadprops (); } return props.getProperty (key, defaultValue); }}Примечание. Таким образом, когда класс загружен, он автоматически будет считывать содержимое файла конфигурации в указанном месте и сохранить его в статических свойствах, что является эффективным и удобным, и может быть загружен за один раз и используется несколько раз.
4. Меры предосторожности и предложения
Первые три метода жесткие в приведенных выше пяти методах. И если вы хотите использовать их в бобах с аннотацией @Controller, вам необходимо объявить их в файле конфигурации SpringMVC Spring-Mvc.xml. Если вы хотите использовать их в бобах с @Service, @Respository и т. Д., Вы должны объявить их в Spring.xml в файле конфигурации Spring.
Я лично рекомендую методы четвертого и пятого конфигурации. Пятая лучшая. Его даже не нужно вводить в инструментальный объект, и он напрямую вызывает статический метод для сбора, и он загружает его только один раз, что также высокоэффективно. Более того, первые три метода не очень гибки, и требуется значение ключа @Value.
5. Проверьте, чтобы проверить, доступно ли он
1. Сначала мы создаем Propertiesservice
пакет com.hafiz.www.service;/** * desc: программа Java получает услугу содержания файла свойств *, созданного Hafiz.zhang на 2016/9/16. */propertiesservice propertiesservice {/** * * * / ** * Второй метод реализации получает значение указанного ключа в файле свойств * * @return */ string getProperyByseCondway (); / ** * Третий метод реализации получает значение указанного ключа в файле свойств * * @return */ string getProperyByThirdway (); / ** * Четвертый метод реализации получает значение указанного ключа в файле свойств * * @param key * * @return */ string getProperyByfourthway (String Key); / ** * Четвертый метод реализации получает значение указанного ключа в файле свойств * * @param key * * @param defaultvalue * * @return */ string getProperyBourthway (String Key, String defaultValue); / ** * Пятый метод реализации получает значение указанного ключа в файле свойств * * @param key * * @return */ string getProperyByfifthway (String Key); / ** * Пятый метод реализации для получения значения указанного ключа в файле свойств * * @param key * * @param defaultvalue * * @return */ string getProperyBifthway (String Key, String defaultValue);}2. Создать и реализовать класс PropertiesserviceImpl
пакет com.hafiz.www.service.impl; import com.hafiz.www.service.propertiesservice; import com.hafiz.www.util.propertyconfigurer; импорт com.hafiz.www.util.propertyutil; импорт org.spramework.beans.factory.antaitation; org.springframework.beans.factory.annotation.value; import org.springframework.stereotype.service;/*** desc: программа Java получает класс реализации услуг, который получает содержание файла свойств*, созданного Hafiz.zhang в 2016/9/16. */ @ServicePublic Class PropertiesserviceImpl реализует Propertiesservice {@Value ("$ {test}") частная строка TestDatabyFirst; @Value ("#{prop.Test}") частная строка testDatabySecond; @Value ("#{PropertiesReader [test]}") private String testDatabyThird; @Autowired Private PropertyConfigurer PC; @Override public String getProperyByfirstway () {return testdatabyfirst; } @Override public String getProperyByseCondway () {return TestDatabySecond; } @Override public String getProperyByThirdway () {return testDatabyThird; } @Override public String getProperyByfourthway (String Key) {return pc.getProperty (key); } @Override public String getProperyByfourthway (String Key, String DefaultValue) {return Pc.getProperty (Key, defaultValue); } @Override public String getProperyByfifthway (String Key) {return propertyutil.getPropery (key); } @Override public String getProperyByfifthway (String Key, String DefaultValue) {return Propertytil.getProperty (Key, defaultValue); }}3. Controller Class PropertyController
пакет com.hafiz.www.controller; import com.hafiz.www.service.propertiesservice; import com.hafiz.www.util.propertyutil; import org.springframework.beans.factory.annotation.autowired; import org.spramework.steryotyplety.controller. org.springframework.web.bind.annotation.pathviable; импорт org.springframework.web.bind.annotation.requestmapping; импорт org.springframework.web.bind.annotation.requestmethod; импорт org.spramework.web.bindessont.sansponsesshody; Контроллер* Создан Hafiz.zhang 2016/9/16. */@Controller@requestmapping ("/prop") public class propertycontroller {@autowired Private Propertiesservice PS; @RequestMapping (value = "/way/first", method = requestMethod.get) @Responsebody public String getPropertyByfirStway () {return ps.getProperyByfirStway (); } @RequestMaping (value = "/way/second", method = requestMethod.get) @Responsebody public String getPropertyByseCondway () {return ps.getProperyByseCondway (); } @RequestMapping (value = "/way/third", method = requestMethod.get) @Responsebody public String getPropertyByThird () {return ps.getProperyByThird (); } @RequestMapping (value = "/way/ourth/{key}", method = requestMethod.get) @Responsebody public String getPropertyByfourthway (@pathvariable ("key") String Key) {return ps.getProperyByfourthway (ключ "," defaultValue "); } @RequestMapping (value = "/way/fifth/{key}", method = requestMethod.get) @Responsebody public String getPropertyByfifthway (@pathvariable ("key") String Key) {return properatemit.getProperty (key, "defaultValue"); }}4.jdbc.properties файл
jdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: //192.168.1.196: 3306/dev? useUnicode = true & harementencoding = utf-8jdbc.username = rootjdbc.password = 123456jdbc.maxa ctive = 200jdbc.minidle = 5jdbc.initialsize = 1jdbc.maxwait = 60000jdbc.timeweeweevictionrunsmillis = 60000jdbc.minevictableIdletimemilis = 300000jdbc.validationQuery = Select 1 от t_userjdbc.testwhileidle = trueJdbc.testonreturn = falseJdbc.poolpReparedStatements = trueJdbc.maxpoolpreparedStatementPernectionsize = 20jdbc.filters = stat#test DataSt = com.hafiz.www
5. Диаграмма результатов проекта
6. Загрузка проекта: демонстрация http://xiazai.vevb.com/201612/yuanma/propertiesconfigurer_jb51.zip
7. Результаты теста
Первый метод
Второй путь
Третий путь
Четвертый метод
Пятый метод
6. Резюме
Благодаря этому обзору и тестированию мы понимаем роль и принцип взаимосвязи контейнера родительского ребенка между Spring и SpringMVC и атрибутом FILTERS-Filters, который легче всего игнорировать при сканировании контекста: компонентный пакет тегов. Иметь возможность лучше найти и быстро решить проблемы, с которыми сталкиваются снова. В любом случае, отлично ~~~
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.