2015-12-31 2 views
2
Project X 
--------- 
public class A {} 

Public class B{ 
    @Autowire 
    private A a; 

    @Autowire 
    private D d; 
} 


Project Y 
--------- 
Public class C{ 
    public static void main(String[] args) throws Exception { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring/application-Context.xml"); 
     B b = context.getBean("b", B.class); 
    } 
} 

application-Context.xml 
<bean id="a" class="A" /> 
<bean id="b" class="B" /> 

Вопрос: У меня есть настройки, как и выше, где у меня есть двоичный Project X, и в настоящее время я работаю над проектом Y. Я хочу, чтобы создать объект класса B без создания D в проекте Y. Каков наилучший способ сделать это?Игнорировать инъекции весны зависимостей: XML

+0

вы не можете изменить класс B? У вас есть только бинарный файл? –

+0

Да, не касаясь проекта X – Nihanth

ответ

1

Вы можете использовать это поле в аннотации с автосохранением.

@Autowired(required=false) 
private D d; 

Если у вас нет доступа к проекту X, вам нужно сделать какой-то взлом.

В вашем проекте создайте класс, обозначенный как сервис, и увеличьте класс D, так что весна будет вводить ваш класс.

@Component 
@Primary 
public class MockD extends D { 

} 

В этом случае @Primary скажет пружине, чтобы принять это с приоритетом вместо другой реализации. Таким образом, ваш класс будет введен в класс B

+0

Проблема в том, что у меня нет доступа к проекту X – Nihanth

+0

Редактировать мой комментарий. Это взломать, но у вас нет другого выбора, если вы не можете получить доступ к проекту x – Aviad

0

Инъекция зависимостей никогда не является обязательной. Это зависит от программиста, который хочет вставить этот компонент или нет.

Так вот в определении Б, вы можете просто вводить только фасоль А, как указано ниже:

application-Context.xml 
<bean id="a" class="A" /> 
<bean id="b" class="B" > 
    <property name="a" ref="a" /> 
</bean> 

только если класс B расширяет InitializingBean и отменяет afterPropertiesSet метод и проверяет, если D вводится, то только это может привести к вопрос, иначе вы были бы хороши с помощью инъекции. Не нужно создавать и вводить фасоль D как таковую.

+0

в моем приложении-контексте. XML-файл у меня есть <контекст: аннотация-конфигурация /> он бросает: Вызванные: org.springframework.beans.factory.NoSuchBeanDefinitionException: нет соответствие рожкового типа [xyzD] не найдено для зависимостей: ожидаются, по крайней мере, 1 боб, который квалифицируется как кандидат autwire для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} – Nihanth

0
<!--<context:annotation-config/>--> 
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"> 
<property name="requiredParameterValue" value="false" /> 

вместо добавления аннотаций-конфигурации, необходимо добавить выше одного

Смежные вопросы