<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 加载属性配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- xml配置事务 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 通知 -->
<tx:advice id="txAdvie" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*"/>
<tx:method name="save*"/>
<tx:method name="insert*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- aop -->
<aop:config>
<aop:pointcut expression="execution(* com.lj.service.*.*(..))" id="cut"/>
<aop:advisor advice-ref="txAdvie" pointcut-ref="cut"/>
</aop:config>
<!-- user -->
<bean id="userDao" class="com.lj.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userService" class="com.lj.service.impl.UserServiceImpl">
</bean>
<!-- action需要设置为原型scope=prototype,不能设置为单例,默认不写就是singleton单例 -->
<bean id="userAction" class="com.lj.action.UserAction" scope="prototype">
</bean>
</beans>
这个是action:
package com.lj.action;
import org.springframework.beans.factory.annotation.Autowired;
import com.lj.model.User;
import com.lj.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
@Autowired
private UserService userService;
public String hello() {
return SUCCESS;
}
public String findUserById(){
User user = userService.findUserById(1);
System.out.println(user.toString());
return SUCCESS;
}
}
这个是service:
package com.lj.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import com.lj.dao.UserDao;
import com.lj.model.User;
import com.lj.service.UserService;
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Override
public User findUserById(int id) {
return userDao.selectUserById(id);
}
}
如果不用@autowired的话,使用最老的xml的配置方式,注入是成功的,使用@autowired action中service就会为null
使用@Autowired注解 那你的xml里面有没有配置注解扫描路径?
你使用注解注入,你得告诉spring去哪里扫描你的注解吧???
就算你不配置扫描路径,至少得加上<context:annotation-config/>吧>
如果你想使用Autowired注解又不想加上上面的那个配置,那么最起码你也要把这个加上吧?
<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/>
应该是“spring的bean的注解扫描器“的配置有问题;
或者是你没有给service层添加注解“@Service("userService")”
我在applicationContext.xml中已经配置了
<bean id="userService"class="com.lj.service.impl.UserServiceImpl">
</bean>
这样应该和@Service("userService")”一样吧
@派小星: 那你试一下这个“@Autowired("userService")”
@派小星: 我写错了,应该是
@Autowired
@Qualifier("userServiceImpl")
@派小星: 不过我听到另一种想法:
有人说不能用实体类型来接收自动装配的增强类(就是动态代理类),因为它们是兄弟,所以只能用实体类的接口来接收增强类,因为实体类和增强类都实现了相同的接口。
我不知道对不对,你可以试一下,用接口来接收。
@不喜欢蛀牙: 这样的话,你可以用@Resource注解
注解发生歧义了,你是不是有多个接口userDao实现类啊???
没有啊,就是1个userService1个userServiceImpl,1个userDao,1个dao的实现类。我如果还用原始的再applicationContext.xml中注入serviceimpl,是没问题的,但是一旦换成上面那样就有问题