2017-06-18 55 views
0

我有一些@Bean注释配置,它的工作原理。 但是,如果我改变bean从接口继承它是行不通的。我需要特殊的注释吗?春天injectin bean继承表单接口

配置类片断withot进口

@Configuration 
@ComponentScan("io.github.aaa4") 
//@ComponentScan({ "io.github.aaa4.dao", "io.github.aaa4.entity","io.github.aaa4.Servlets"}) 
@EnableTransactionManagement 
public class AppConfig { 

    @Bean 
    public ComboPooledDataSource myDataSource() throws PropertyVetoException { 
     ComboPooledDataSource ds = new ComboPooledDataSource(); 

     ds.setDriverClass("com.mysql.jdbc.Driver"); 
     ds.setJdbcUrl("jdbc:mysql://localhost:3306/emp?useSSL=false"); 
     ds.setUser("emp"); 
     ds.setPassword("emp"); 
     ds.setMinPoolSize(2); 
     ds.setMaxPoolSize(20); 
     ds.setMaxIdleTime(30000); 

     return ds; 
    } 

    @Bean 
    public LocalSessionFactoryBean mySessionFactory() throws PropertyVetoException { 
     LocalSessionFactoryBean sf = new LocalSessionFactoryBean(); 
     Properties hibernateProperties = new Properties(); 
     hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); 
     hibernateProperties.setProperty("hibernate.show_sql", "true"); 

     sf.setDataSource(myDataSource()); 
     sf.setPackagesToScan("io.github"); 
     sf.setHibernateProperties(hibernateProperties); 

     return sf; 
    } 

    @Bean 
    @Autowired 
    public HibernateTransactionManager myTransactionManager(SessionFactory sessionFactory) { 
     HibernateTransactionManager htm = new HibernateTransactionManager(); 
     htm.setSessionFactory(sessionFactory); 

     return htm; 
    } 


    @Bean 
    public UserDao userDaoImpl() { 
     return new UserDaoImpl(); 
    } 

    @Bean 
    public DBService dBServiceImpl() { 
     return new DBServiceImpl(); 
    } 

} 

serviceImpl片断

@Service 
public class DBServiceImpl implements DBService { 

    //inject user DAO 
    @Autowired 
    private UserDao userDao; 

    @Transactional 
    public void addUser(MyUser user) { 
     userDao.createUser(user); 
    } 

    @Transactional 
    public List<MyUser> getUserList() { 
     return userDao.getusers(); 
    } 

    @Transactional 
    public void deleteUser(int theId) { 
     userDao.deleteUser(theId); 
    } 


} 

主类

public class Main { 
public static void main(String[] args) { 
     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); 

     DBServiceImpl service = ctx.getBean(DBServiceImpl.class); 

     MyUser user = new MyUser("alice", "and her passwd"); 
     System.out.println("this is the user:" + user); 
     service.addUser(user); 
     service.addUser(user); 
     service.addUser(user); 
     service.addUser(user); 
     System.out.println("User added!"); 
     service.deleteUser(2); 
     System.out.println("user number id = 2 deleted"); 
     List<MyUser> userList = service.getUserList(); 
     for (MyUser users : userList) 
      System.out.println(users); 
     ctx.close(); 
    } 

} 

堆栈跟踪与问题

INFO: Using DataSource [com.mchange.v2.c3p0.ComboPooledDataSource[ identityToken -> 1hge1459o1fr6qmlst9469|42e99e4a, dataSourceName -> 1hge1459o1fr6qmlst9469|42e99e4a ]] of Hibernate SessionFactory for HibernateTransactionManager 

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'io.github.aaa4.services.DBServiceImpl' available 

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353) 

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340) 

    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1093) 
    at io.github.aaa4.Main.main(Main.java:30) 

与注释@EnableAspectJAutoProxy(proxyTargetClass =真)配置类

WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:223) 
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:702) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:527) 
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84) 
    at io.github.aaa4.Main.main(Main.java:14) 
Caused by: java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
    at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.<clinit>(ReflectiveAspectJAdvisorFactory.java:77) 
    at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.initBeanFactory(AnnotationAwareAspectJAutoProxyCreator.java:78) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.setBeanFactory(AbstractAdvisorAutoProxyCreator.java:60) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1647) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1615) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) 
    ... 10 more 
Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 16 more 
+0

莫非你仔细检查,要么在'aspectjtools'或'aspectjweaver'库,存在于应用程序的classpath – AntJavaDev

回答

0

尝试上面使用的接口,而不是实现

DBService service = ctx.getBean(DBService.class); 

的你有你的服务方法@Transactional注解。应在启动时扫描所有@Transactional注释,并且目标方法应变为事务性。添加事务行为Spring为您的类创建一个代理。这就是为什么你不能得到你的豆。

+0

我试了两次,得到如下所示: 引起:org.springframework.beans.factory.BeanNotOfRequiredTypeException:名为'DBServiceImpl'的Bean预计是'io.github.aaa4.services.DBServiceImpl'类型,但是实际上是键入'com.sun.proxy。$ Proxy29' – NyansusCoder

+0

您是否使用完全相同的代码我上面提到过? –

+0

以及如何修复它? 不要使用界面?恕我直言,这是不好的方式。 – NyansusCoder