简体   繁体   English

如何在Spring MVC中将一个Bean自动连接到另一个Bean

[英]How to autowire one bean to another bean in spring mvc

i have two classes ie two beans annotated with @Component(SampleBean.java) and @Controller(TestController.java). 我有两个类,即用@Component(SampleBean.java)和@Controller(TestController.java)注释的两个bean。

I want to autowire SampleBean.java in TestController.java 我想在TestController.java中自动装配SampleBean.java

here my code is : 这是我的代码:

MyServletInterface.java MyServletInterface.java

            public interface MyServletInterface {
                  public void m2(); 

            }

SampleBean.java SampleBean.java

            import org.hibernate.SessionFactory;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.stereotype.Component;

            @Component
            public class SampleBean implements MyServletInterface {

                @Autowired
                SessionFactory sessionFactory;

                public void m2() {
                    System.out.println("SessionFactory >:< " + sessionFactory);

                }

            }

TestController.java TestController.java

                package sample.test;

                import org.hibernate.SessionFactory;
                import org.springframework.beans.factory.annotation.Autowired;
                import org.springframework.stereotype.Controller;
                import org.springframework.web.bind.annotation.RequestMapping;
                import org.springframework.web.servlet.ModelAndView;                    


                @Controller
                public class TestController {

                    @Autowired
                    SessionFactory sessionFactory;

                    @Autowired
                    MyServletInterface ms;

                    @RequestMapping("/form")
                    public ModelAndView method() {
                        System.out.println("inside method");
                        ms.m2();

                        System.out.println("SessionFactory : " + sessionFactory);
                        return new ModelAndView("check_size");
                    }

                    public MyServletInterface getMs() {
                        return ms;
                    }

                    public void setMs(MyServletInterface ms) {
                        this.ms = ms;
                    }

                }

i want autowire the SampleBean.java into TestController.java 我想将SampleBean.java自动连接到TestController.java

by above approach i got exception : 通过上述方法,我得到了例外:

Jul 24, 2017 4:18:52 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
            INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
            Jul 24, 2017 4:18:53 PM org.springframework.web.context.ContextLoader initWebApplicationContext
            SEVERE: Context initialization failed
            org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: in.co.velox.webservice.util.MyServletInterface sample.test.TestController.ms; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [MyServletInterface] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
                at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
                at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
                at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
                at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
                at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
                at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
                at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
                at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
                at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
                at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
                at java.lang.Thread.run(Thread.java:745)
            Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: in.co.velox.webservice.util.MyServletInterface sample.test.TestController.ms; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [in.co.velox.webservice.util.MyServletInterface] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
                at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
                ... 22 more
            Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [MyServletInterface] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
                ... 24 more

            Jul 24, 2017 4:18:53 PM org.apache.catalina.core.StandardContext listenerStart
            SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
            org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: in.co.velox.webservice.util.MyServletInterface sample.test.TestController.ms; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [MyServletInterface] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
                at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
                at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
                at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
                at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
                at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
                at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
                at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
                at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
                at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
                at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
                at java.lang.Thread.run(Thread.java:745)
            Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: in.co.velox.webservice.util.MyServletInterface sample.test.TestController.ms; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [MyServletInterface] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
                at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
                ... 22 more
            Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [MyServletInterface] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
                at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
                at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
                ... 24 more

spring-config.xml 春天-config.xml中

                            <?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:tx="http://www.springframework.org/schema/tx"
                xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
                xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
                                   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
                                   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">



                <context:annotation-config />
                <mvc:annotation-driven />
                <context:component-scan base-package="sample.test" />
                <context:property-placeholder location="classpath:application.properties" />



                <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
                    destroy-method="close">
                    <property name="driverClassName" value="${database.driverClassName}" />
                    <property name="url" value="${database.url}" />
                    <property name="username" value="${database.username}" />
                    <property name="password" value="${database.password}" />

                </bean>


                <bean id="sessionFactory"
                    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
                    <property name="dataSource" ref="dataSource"></property>
                    <property name="hibernateProperties">
                        <props>
                            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                        </props>
                    </property>

                </bean>
                <bean
                    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/WEB-INF/jsppages/" />
                    <property name="suffix" value=".jsp" />
                </bean>     


            </beans>

Exception trace suggests that bean was not found at the time of injecting in controller class. 异常跟踪表明在控制器类中注入时未找到bean。 Can you check if component scan includes your base package where SampleBean class resides. 您是否可以检查组件扫描是否包括SampleBean类所在的基本包。 If you have excluded or missed this class this wont be eligible for auto-scanning. 如果您已排除或错过了该课程,则将没有资格进行自动扫描。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM