BAEL-1592 (#3773)
* Injecting Prototype Beans into Singleton Instance * removed final keywords from the test
This commit is contained in:
parent
d3c292a093
commit
69842b7dea
43
spring-core/src/main/java/com/baeldung/scope/AppConfig.java
Normal file
43
spring-core/src/main/java/com/baeldung/scope/AppConfig.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package com.baeldung.scope;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonAppContextBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonObjectFactoryBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonProviderBean;
|
||||||
|
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Scope;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ComponentScan("com.baeldung.scope")
|
||||||
|
public class AppConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
||||||
|
public PrototypeBean prototypeBean() {
|
||||||
|
return new PrototypeBean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SingletonBean singletonBean() {
|
||||||
|
return new SingletonBean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SingletonProviderBean singletonProviderBean() {
|
||||||
|
return new SingletonProviderBean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SingletonAppContextBean singletonAppContextBean() {
|
||||||
|
return new SingletonAppContextBean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SingletonObjectFactoryBean singletonObjectFactoryBean() {
|
||||||
|
return new SingletonObjectFactoryBean();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.baeldung.scope;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonBean;
|
||||||
|
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
||||||
|
import org.springframework.context.annotation.*;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ComponentScan("com.baeldung.scope")
|
||||||
|
public class AppProxyScopeConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
|
||||||
|
public PrototypeBean prototypeBean() {
|
||||||
|
return new PrototypeBean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SingletonBean singletonBean() {
|
||||||
|
return new SingletonBean();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.baeldung.scope;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonBean;
|
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
public class BeanInjectionStarter {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws InterruptedException {
|
||||||
|
|
||||||
|
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
|
||||||
|
SingletonBean firstSingleton = context.getBean(SingletonBean.class);
|
||||||
|
PrototypeBean firstPrototype = firstSingleton.getPrototypeBean();
|
||||||
|
|
||||||
|
SingletonBean secondSingleton = context.getBean(SingletonBean.class);
|
||||||
|
PrototypeBean secondPrototype = secondSingleton.getPrototypeBean();
|
||||||
|
|
||||||
|
Assert.isTrue(firstPrototype.equals(secondPrototype), "The same instance is returned");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.baeldung.scope.prototype;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
public class PrototypeBean {
|
||||||
|
|
||||||
|
private final Logger logger = Logger.getLogger(this.getClass());
|
||||||
|
|
||||||
|
public PrototypeBean() {
|
||||||
|
logger.info("Prototype instance created");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.baeldung.scope.singletone;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
|
||||||
|
public class SingletonAppContextBean implements ApplicationContextAware {
|
||||||
|
|
||||||
|
private ApplicationContext applicationContext;
|
||||||
|
|
||||||
|
public PrototypeBean getPrototypeBean() {
|
||||||
|
return applicationContext.getBean(PrototypeBean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||||
|
this.applicationContext = applicationContext;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.baeldung.scope.singletone;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.time.LocalTime;
|
||||||
|
|
||||||
|
public class SingletonBean {
|
||||||
|
|
||||||
|
private final Logger logger = Logger.getLogger(this.getClass());
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PrototypeBean prototypeBean;
|
||||||
|
|
||||||
|
public SingletonBean() {
|
||||||
|
logger.info("Singleton instance created");
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrototypeBean getPrototypeBean() {
|
||||||
|
logger.info(String.valueOf(LocalTime.now()));
|
||||||
|
return prototypeBean;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.baeldung.scope.singletone;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import org.springframework.beans.factory.annotation.Lookup;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class SingletonLookupBean {
|
||||||
|
|
||||||
|
@Lookup
|
||||||
|
public PrototypeBean getPrototypeBean() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.baeldung.scope.singletone;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import org.springframework.beans.factory.ObjectFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
public class SingletonObjectFactoryBean {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ObjectFactory<PrototypeBean> prototypeBeanObjectFactory;
|
||||||
|
|
||||||
|
public PrototypeBean getPrototypeInstance() {
|
||||||
|
return prototypeBeanObjectFactory.getObject();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.baeldung.scope.singletone;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
|
public class SingletonProviderBean {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Provider<PrototypeBean> myPrototypeBeanProvider;
|
||||||
|
|
||||||
|
public PrototypeBean getPrototypeInstance() {
|
||||||
|
return myPrototypeBeanProvider.get();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package com.baeldung.scope;
|
||||||
|
|
||||||
|
import com.baeldung.scope.prototype.PrototypeBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonLookupBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonObjectFactoryBean;
|
||||||
|
import com.baeldung.scope.singletone.SingletonProviderBean;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
import org.springframework.context.support.AbstractApplicationContext;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
import org.springframework.test.context.support.AnnotationConfigContextLoader;
|
||||||
|
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = AppConfig.class)
|
||||||
|
public class PrototypeBeanInjectionTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPrototypeInjection_WhenObjectFactory_ThenNewInstanceReturn() {
|
||||||
|
|
||||||
|
AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
|
||||||
|
|
||||||
|
SingletonObjectFactoryBean firstContext = context.getBean(SingletonObjectFactoryBean.class);
|
||||||
|
SingletonObjectFactoryBean secondContext = context.getBean(SingletonObjectFactoryBean.class);
|
||||||
|
|
||||||
|
PrototypeBean firstInstance = firstContext.getPrototypeInstance();
|
||||||
|
PrototypeBean secondInstance = secondContext.getPrototypeInstance();
|
||||||
|
|
||||||
|
Assert.assertTrue("New instance expected", firstInstance != secondInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPrototypeInjection_WhenLookup_ThenNewInstanceReturn() {
|
||||||
|
|
||||||
|
AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
|
||||||
|
|
||||||
|
SingletonLookupBean firstContext = context.getBean(SingletonLookupBean.class);
|
||||||
|
SingletonLookupBean secondContext = context.getBean(SingletonLookupBean.class);
|
||||||
|
|
||||||
|
PrototypeBean firstInstance = firstContext.getPrototypeBean();
|
||||||
|
PrototypeBean secondInstance = secondContext.getPrototypeBean();
|
||||||
|
|
||||||
|
Assert.assertTrue("New instance expected", firstInstance != secondInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPrototypeInjection_WhenProvider_ThenNewInstanceReturn() {
|
||||||
|
|
||||||
|
AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
|
||||||
|
|
||||||
|
SingletonProviderBean firstContext = context.getBean(SingletonProviderBean.class);
|
||||||
|
SingletonProviderBean secondContext = context.getBean(SingletonProviderBean.class);
|
||||||
|
|
||||||
|
PrototypeBean firstInstance = firstContext.getPrototypeInstance();
|
||||||
|
PrototypeBean secondInstance = secondContext.getPrototypeInstance();
|
||||||
|
|
||||||
|
Assert.assertTrue("New instance expected", firstInstance != secondInstance);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user