Я деконструирую, как Spring управляет объектами Java с простым примером.
Во -первых, определите простой Pojo, код выглядит следующим образом:
Пакет com.jvk.ken.spring; открытый класс Demo {private String name; public demo () {name = "im Demo.";} public void printname () {System.out.println (name);} public void setName (String name) {this.name = name;}}Соответствующий файл конфигурации пружины выглядит следующим образом:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/context http://www.spramework.org/schema/context-3.1spring-3.3 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd "> <Bean Id ="/Beains/Spring-Beans-3.1.xsd "
Простой тестовый код заключается в следующем:
пакет com.jvk.ken.spring; import org.springframework.beans.factory.beanfactory; import org.springframework.beans.factory.xml.xmlbeanfactory; импорт org.springframework.core.io.classpathresource; тест открытого класса {public static void a Main (string) arpaspathresource; {testspring ();} private static void testspring () выбрасывает exection {beanfactory bf = new XmlbeanFactory (new ClassPathresource ("ApplicationContext.xml")); Demo Bean = (Demo) bf.getbean ("demo"); System.out.println (bean.getClass ()); bean.printname ();}}Запустите тестовый класс и выводите следующую информацию, указывая на то, что простой пружинный пример был успешно запущен.
2012-3-28 22:18:07 org.springframework.beans.factory.xml.xmlbeandefinitionReader LoadBeanDefinitions Информация: Загрузка определений XML Bean из ресурса Class Path [ApplicationContext.xml] com.jvk.ken.spring.demo It Demo.
Из короткого кода Java и файла конфигурации XML мы видим, что xmlbeanfactory собирает Javabean, прочитав файл конфигурации XML, и возвращает требуемый объект, когда пользователь вызывает метод GetBean. Чтобы имитировать его поведение, я определяю простой Beanfactory.
Пакет com.jvk.ken.spring; import java.util.hashmap; import java.util.map; открытый класс mybeanfactory {// Сохранить определение карты бобов <строка, класс> beans = new hashmap <string, class>; beans.get (id) .newinstance ();} private string xmlfile; public mybeanfactory (string xmlfile) бросает classnotfoundexception {super (); this.xmlfile = xmlfile; init ();} private void init () throws classnotfoundexception {// инициализировать и parse xml, здесь пропущено фактическое парирование XML, и используйте жесткий код для имитирования system.out.println ("Файл конфигурации:"+xmlfile); "com.jvk.ken.spring.demo"; class <?> loadclass = this.getClass (). getClassloader ().Тестовый код заключается в следующем:
Пакет com.jvk.ken.spring; открытый тест класса {public static void main (string [] args) бросает исключение {testnotspring ();} частное статическое void testnotspring () исключает исключение {mybeanfactory bf = new mybeanfactory ("applicateContext.xml"); demo bean = (demo) bf.getbean ("demo"); System.out.println (bean.getClass ()); bean.printname ();}}После запуска вывод следующая информация:
Файл конфигурации: ApplicationContext.xml Class com.jvk.ken.spring.demo Im Demo.
Приведенный выше короткий код показывает, как Spring действует как самая простая фабрика бобов. Давайте немного настроим код, чтобы проанализировать, что происходит весной. Во -первых, измените метод строительства без параметра в частном классе на частное.
Private Demo () {name = "Я демонстрация"; }Запуск тестового кода показал, что в результатах весеннего теста не было никакой разницы, но в моем индивидуальном MybeanFactory сообщили следующее сообщение об ошибке:
Исключение в потоке "main" java.lang.illegalaccessexexception: class com.jvk.ken.spring.mybeanfactory не может получить доступ к члену класса com.jvk.ken.spring.demo с модификаторами "private" на sun.reflect.reflection.ensurememberccess (Reflection.java:65) java.lang.class.newinstance0 (class.java:349) на java.lang.class.newinstance (class.java:308) на com.jvk.ken.spring.mybeanfactory.getbean (mybeanfactory.java:12) на com.jvk.ken.spring.test.testnotspring (test.java:25) на com.jvk.ken.spring.test.main (test.java:9)
Весна такая волшебная? Нет, код, который я написал, слишком прост, и его можно запустить непосредственно с небольшим изменением.
public Object getBean (String Id) Throws Exception {class class1 = beans.get (id); Конструктор DecladReDConstructor = class1.getDeclaredConstructor (); decladravedConstructor.setAccessible (true); return decladravedConstructor.newinStance (); }Выше всего является самым чистым Javabean, управляемым весенним контейнером. Весна также поддерживает другой тип бобов, называемый Factory Bean, пример лучше, чем тысяча слов, см. Код
Пакет com.jvk.ken.spring; import org.springframework.beans.factory.factorybean; открытый класс демофакторные реализации Factorybean {@override public object getObject () исключает exection {return new demo ();}@override public class getObjectTyp () {return demo.clas ЛОЖЬ;}}После добавления класса демофа?
<bean id = "demo" />
Другие коды не изменены. После запуска тестового кода результаты выходных данных точно такие же, как и раньше. Почему класс com.jvk.ken.spring.demofactory с идентификатором настроен, но возвращаемый результат является демонстрационным экземпляром? Это связано с тем, что Spring обнаруживает, что демофактор - это специальный боб, который реализует интерфейс заводской бобы. Метод GetObject будет вызван до возврата результата, поэтому конечным результатом является демонстрационный объект. Конечно, если нам действительно нужно получить фабрику, мы можем написать Bf.getbean ("& Demo"), как это.
Суммировать
Приведенное выше - все подробное объяснение кода создания объектов внедрения Spring, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!