Tag: dependency injection

Android Dagger 2 Dependency没有被注入

我正在尝试将Dagger 2用于我的应用程序,但我遇到了有关实体存储库的一些问题,而且我还没有弄明白我错过了什么。 这是我的应用程序组件: @Singleton @Component( modules = { AndroidModule.class, RepositoryModule.class } ) public interface ApplicationComponent { void inject(AndroidApplication app); IDependenceyRepository dependencyRepository(); } 我的模块: @Module public class RepositoryModule { @Provides @Singleton IDependenceyRepository provideDependendencyRepository(Context context) { return new DependencyRepository(context); } } @Module public class AndroidModule { private final AndroidApplication app; public AndroidModule(AndroidApplication app) { this.app = app; […]

匕首2:如何注入Map <Class ,Provider >

在Dagger 2中,是否可以注入Map<Class, Provider> Map<Class, Provider> Map<Class, Provider> ? 假设,我有几个扩展Foo的类 class Bar extends Foo { @Inject Bar() {} } class Baz extends Foo { @Inject Baz() {} } 现在我想通过声明来创建一个FooFactory class FooFactory { @Inject FooFactory(Map<Class, Provider> providers) {} } 我能用最少的配置在Dagger 2中做到这一点吗? 我读过有关Multibinding但我无法使用它。

有没有一种简单的方法为每个类创建一个记录器实例?

我现在使用静态方法来记录(因为我发现登录Android非常容易),但现在我需要为不同的类配置不同的appender,所以我遇到了静态日志记录方法的问题。 我读了Log4J:创建Logger实例的策略 ,我注意到我现在是时候更改日志记录策略了,所以我需要以下代码到我的类,需要一个特殊的记录器。 private static final Logger logger = Logger.getLogger(XXXX.class); 我觉得既然这是重复的工作,那么我们有什么方法可以避免向每个类添加重复的代码,或者只是编写更少的代码。 AOP或dependency injection可以做这样的工作吗? 我正在使用log4j和Spring,但是其他任何方法都将受到高度赞赏。

Android TestCase中的Dagger 2dependency injection

我已经构建了一个示例应用程序(是的,它实际上只是一个示例,没有多大意义,但有助于理解Dagger 2中的Android清洁架构和dependency injection)。 我的代码可以在github上找到 。(过时。看到这篇文章)示例应用程序只是让你在EditText输入一个名字,如果按下按钮,你会看到一条消息“Hello YourName” 我有三个不同的组件: ApplicationComponent , ActivityComponent和FragmentComponent 。 FragmentComponent包含三个模块: ActivityModule FragmentModule InteractorModule InteractorModule提供了一个MainInteractor 。 @Module public class InteractorModule { @Provides @PerFragment MainInteractor provideMainInteractor () { return new MainInteractor(); } } 在我的Activity-UnitTest中,我想伪造这个MainInteractor 。 这个Interactor只有一个方法public Person createPerson(String name) ,它可以创建一个Person对象。 FakeMainInteractor具有相同的方法,但始终创建​​一个名为“Fake Person”的Person对象,与您传递的参数FakeMainInteractor 。 public class FakeMainInteractor { public Person createPerson(final String name) { return new […]

无法自动assembly方法

我收到了这个错误 org.springframework.beans.factory.BeanCreationException: Could not autowire method: 这是我的spring的xml配置。 … 这是我的代码,我在Java类中自动assembly它 private InfoModel infoModel; @Autowired public void setInfoModel(InfoModel infoModel) { this.infoModel= infoModel; } 我错过了什么。 我怀疑我应该创建一个InfoModel Interface才能使其自动assembly? Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.model.InfoModel] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920) at […]

@Context返回代理而不是HttpServletRequest(代理范围内没有线程本地值)

理解为什么@Contextdependency injection返回$ Proxy(随机数)实例的集合而不是HttpServletRequest或HttpServletResponse时,我有点问题。 我正在使用Glassfish 3.1.2.2及其版本的Jersey(Jersey:1.11.1),我的应用程序是作为EAR应用程序构建的。 我有简单的@Remote接口,我在那里注释我的方法和REST服务没有任何问题,但是当我尝试访问HttpServletRequest信息时,它只会导致问题。 我的会话bean中有注释的私有字段: @Context private HttpServletRequest request; @Context private HttpServletResponse response; 并创建方法签名以包含@Context作为参数集: @POST @Path(“authenticate”) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON) public Response authenticate(@FormParam(“username”) String username, @FormParam(“password”) String password, @Context HttpServletRequest request, @Context HttpServletResponse response); 当我尝试在条目之后调试方法时,我可以看到全局请求和响应对象为null,其中本地方法实例是$ ProxyXXX类型。 问题是我无法访问(或者我不确定)这些对象。 根据网络上的教程,他们应该可以使用,但是当我尝试访问这些时,这就是抛出: WARNING: StandardWrapperValve[RestDataService]: PWC1406: Servlet.service() for servlet RestDataService threw exception java.lang.IllegalStateException: No thread local value in scope for […]

通过Spring Config将“HardCoded”构造函数Arg Class 传递给bean

我有一个通用类型,我注入服务。 由于generics在Java中的实现方式,我需要一个构造函数arg(或属性setter)来保存generics类型参数的Class信息。 我的问题是 – 我可以通过属性注入或指定构造函数arg,使用spring传入Class的实例吗? 我在运行时知道T的类型,所以我特别知道Type参数是什么。 我以为它看起来像这样: <constructor-arg value="java.lang.class” /> 我完全不知道应该怎么做?

我什么时候应该使用Factory 而不是Provider

Dagger文档显示使用Provider来获取Filter实例,这看起来非常有意义。 我正在编写一个实例化View的ListAdapter ,我希望Dagger能够注入。 我很想将Provider注入我的ListAdapter ,并调用mViewProvider.get()来实例化视图。 但是,Dagger文档说: 注入Provider可能会产生令人困惑的代码,并且可能是图形中错误范围或错误结构对象的设计气味。 通常你会想要使用Factory或Lazy或重新组织你的代码的生命周期和结构,以便能够注入一个T 我可以看到我如何使用工厂,以类似于使用辅助注射时所需的方式。 但是,使用我自己的Factory有什么好处,而不是使用Dagger的Provider ,因为我必须自己写这个?

使用Guice构造函数注入

我有一些使用工厂的示例代码。 我想通过删除工厂来清理代码并使用Guice代替。 我试图这样做,但我遇到了一个小障碍。 我对Guice很新,所以我希望有人可以帮助我。 现有客户端代码(使用工厂): public class MailClient { public static void main(String[] args) { MailConfig config = MailConfigFactory.get(); config.setHost(“smtp.gmail.com”); Mail mail = MailFactory.get(config); mail.send(); } } 我试图使用Guice进行重构: //Replaces existing factories public class MailModule extends AbstractModule { @Override protected void configure() { bind(Mail.class) .to(MailImpl.class); bind(MailConfig.class) .to(MailConfigImpl.class); } } public class MailImpl implements Mail { private […]

如何在jersey 2.0中使用hk2注入常量?

如何在jersey中使用HK2将常量注入某个类? 有了Guice,我可以有类似的课程 public class DependsOnFoo { @Inject public DependsOnFoo(@Named(“FOO”) String foo) { … } … } 我会在注入器中配置类似的东西 bind(String.class).named(“FOO”).toInstance(new String(“foo”)) HK2中的等价物(如果有的话)是多少?