Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
1

Spring Autowired Annotation

14.10.2015, 22:33. Показов 1213. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята, че за нафиг, как это вообще работает?!

Стандартный пример, напечатать HELLO_WORLD, для этого:

1. Класс MessageProvider
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package net.spring.examples.helloworld.annotation;
 
import net.spring.examples.helloworld.entities.MessageProvider;
import org.springframework.stereotype.Service;
 
@Service("messageProvider")
public class HelloWorldMessageProvider implements MessageProvider {
    private static final String HELLO_WORLD_MESSAGE = "Hello world";
 
    @Override
    public String getMessage() {
        return HELLO_WORLD_MESSAGE;
    }
}

2. Класс MessageRenderer
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package net.spring.examples.helloworld.annotation;
 
import net.spring.examples.helloworld.entities.MessageProvider;
import net.spring.examples.helloworld.entities.MessageRenderer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
/**
 * Created by Almaz
 * Date: 14.10.2015
 */
 
@Service("messageRenderer")
public class StandardOutMessageRenderer implements MessageRenderer{
    private MessageProvider messageProvider;
 
    @Override
    public void render() {
        if(messageProvider == null){
            throw new RuntimeException("Please, set message provider first");
        }
        System.out.println(messageProvider.getMessage());
    }
 
    @Autowired
    public void setMessageProvider(MessageProvider messageProvider) {
        this.messageProvider = messageProvider;
    }
 
    @Override
    public MessageProvider getMessageProvider() {
        return this.messageProvider;
    }
}

3. Запускающий класс
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package net.spring.examples.helloworld;
 
import net.spring.examples.helloworld.entities.MessageRenderer;
import org.springframework.context.support.GenericXmlApplicationContext;
 
/**
 * Created by Almaz
 * Date: 14.10.2015
 */
public class HelloWorldSpring {
    public static void main(String[] args) {
        GenericXmlApplicationContext context = new GenericXmlApplicationContext();
        context.load("classpath:chapter1/app-context-annotation.xml");
        MessageRenderer renderer = context.getBean("messageRenderer", MessageRenderer.class);
        renderer.render();
    }
}

4. Xml config
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            [url]http://www.springframework.org/schema/beans/spring-beans.xsd[/url]
            [url]http://www.springframework.org/schema/context[/url]
            [url]http://www.springframework.org/schema/context/spring-context.xsd[/url]
            [url]http://www.springframework.org/schema/util[/url]
            http://www.springframework.org/schema/util/spring-util.xsd">
 
    <context:annotation-config/>
    <context:component-scan base-package="net.spring.examples.helloworld.annotation"/>
</beans>


Каким образом аннотация @Autowired должна подцепить messageProvider'a ?

Не по теме:

Please, только не посылайте к Google, мы с ним сейчас поругались

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2015, 22:33
Ответы с готовыми решениями:

Spring на клиенте и Autowired
У меня есть спринг на клиенте (так уж получилось), в spring-config есть список бинов и есть фабрика...

Spring аннотация Autowired
Всем, добрый день. Изучаю Spring недавно и соответственно столкнулся с некоторыми трудностями. У...

[Spring] @Autowired сервиса
По ТЗ нельзя использовать mvc-фреймворков, но как я понимаю сам контейнер спринга не является mvc...

Spring: using annotation declaration and @Qualifier
Используя для опредиления бинов аннотацию @Component и эту настройку в xml -...

7
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
15.10.2015, 01:46 2
Книжечка Spring 4 для профессионалов, вторая глава? )

@Autowired всего лишь говорит контейнеру о том, что надо бы этому полю предоставить нужную имплементацию. Собственно, это и происходит.

HelloWorldMessageProvider вы пометили аннотацией @Service, которая гарантирует то, что этот класс будет под управлением контейнера (т.е. будет бином ). Уберите ее, и такого результата вы уже не получите.

Добавлено через 3 минуты
Это ознакомительный пример, надо читать дальше )
0
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
15.10.2015, 12:48  [ТС] 3
Цитата Сообщение от neske Посмотреть сообщение
Книжечка Spring 4 для профессионалов, вторая глава? )
Не, книжка Spring 3 для профессионалов, четвертая глава

Проблема в том, что этот код (т.е. аннотация @Autowired) не работает. Через xml все работает как надо, через аннотацию нет. Вот и пытаюсь понять почему не работает, может из-за того что версии разные?
(Юзаю Spring 4, книжка по Spring 3)

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [chapter1/app-context-annotation.xml]
Exception in thread "main" java.lang.RuntimeException: Please, set message provider first
    at net.spring.examples.helloworld.annotation.StandardOutMessageRenderer.render(StandardOutMessageRenderer.java:20)
    at net.spring.examples.helloworld.HelloWorldSpring.main(HelloWorldSpring.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
15.10.2015, 15:10 4
Попробуйте после
Java
1
context.load("classpath:chapter1/app-context-annotation.xml");
добавить
Java
1
context.refresh();
1
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
15.10.2015, 17:59  [ТС] 5
Нет, не получается. Щас гуглю
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [chapter1/app-context-annotation.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@deb6432: startup date [Thu Oct 15 17:58:37 MSK 2015]; root of context hierarchy
Exception in thread "main" java.lang.IllegalArgumentException
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
    at org.springframework.context.annotation.ConfigurationClassUtils.checkConfigurationClassCandidate(ConfigurationClassUtils.java:70)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:253)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at net.spring.examples.helloworld.HelloWorldSpring.main(HelloWorldSpring.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
0
34 / 25 / 15
Регистрация: 06.12.2012
Сообщений: 144
15.10.2015, 19:15 6
Spring создает граф объектов из тех что вы проанатировали и объявили в xml (кстати, пора бы перейти на конфиг классы). Там используется много разных интересных вещей с прокси-объектами и сингтон-инстансами. Смысл в том, что как только spring видит в каком-то классе Autowired, то он сразу подсовывает туда объект-реализацию из графа.

Так же лучше автовайридь не гет-сет а сразу на переменную.
0
169 / 66 / 15
Регистрация: 24.03.2013
Сообщений: 467
Записей в блоге: 1
15.10.2015, 19:42  [ТС] 7
У меня вопрос, как у MessageRenderer в поле MessageProvider проставится конкретный экземпляр?

Давайте пройдемся как работает спринг в данном примере: (в моем видении)
1. Спринг в начале начинает сканировать этот пакет:
Java
1
net.spring.examples.helloworld.annotation
2. Записывает все классы с @Service к себе куда-то в проперти
3. Видит что у MessageRenderer в поле MessageProvider стоит аннотация @Autowired. Тут он пытается его заполнить - вопрос, откуда ему (Спрингу) знать какую реализацию туда инжектить?

Где связь между MessageRenderer & HelloWorldMessageProvider ?
0
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
15.10.2015, 19:46 8
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
Нет, не получается.
Покажи итоговый код.
Чтобы с лоадом не мучаться, можно просто:
Java
1
GenericXmlApplicationContext context = new GenericXmlApplicationContext("classpath:chapter1/app-context-annotation.xml");
Добавлено через 1 минуту
Цитата Сообщение от Almaz_1993 Посмотреть сообщение
Тут он пытается его заполнить - вопрос, откуда ему (Спрингу) знать какую реализацию туда инжектить?
А в этом проекте их много? Реализация одна - подсовывает ее. Если несколько, то кинет эксепшн. И надо будет ему конкретно указать название бина.
0
15.10.2015, 19:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2015, 19:46
Помогаю со студенческими работами здесь

Java Spring (Annotation Controller)
Люди помогите с Java Spring (Annotation Controller). Мучаюсь уже долго но ни чего не работает....

Spring Boot @Autowired в коллекцию
Здравствуйте! Подскажите, пожалуйста, у меня есть коллекция типа Cars, где Cars мой абстрактный...

Jsp+Spring MVC+annotation redirect
Добрый день нужна помощь. Есть home.jsp с формой поиска &lt;div&gt; &lt;form:form modelAttribute=&quot;user&quot;...

Spring и аннотации @Configuration & @Autowired
Здравствуйте! Не могу найти ответ на свой вопрос, подскажите возможно ли такое. При работе с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru