关于spring使用new对象时注解失效问题解决办法

SpringContextUtlis工具类(通过bean的名字来获取有效的bean)

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
@Service
public class SpringContextUtils implements ApplicationContextAware {
	  
		public SpringContextUtils() {
			// TODO Auto-generated constructor stub
		}
		
	    private static ApplicationContext applicationContext;
	  
	    public void setApplicationContext(ApplicationContext context) throws BeansException {
	    applicationContext = context;
	    }
	  
	    public static ApplicationContext getApplicationContext() {
	        return applicationContext;
	    }
	  
	    public static void createContext() {
	    	applicationContext = new ClassPathXmlApplicationContext("spring-mvc.xml");
		}
	    
	    @SuppressWarnings("unchecked")
	    public static <T> T getBean(String name) throws BeansException {
	        if (applicationContext == null){
	                    return null;
	                }
	        return (T)applicationContext.getBean(name); 
	    }
	}


在相应的spring-*.xml文件中手动写bean

 <!-- Service调用Dao -->
  <bean id="systemAction" class="com.cn.xt.system.SystemAction">
		<property name="systemMapper" ref="systemMapper"/>
	</bean>
<!-- Dao调用sqlSessionFactory -->	
	<bean id="systemMapper" class="com.cn.xt.daoImpl.systemMapperImpl">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring 中,`@Transactional` 注解是基于 AOP 实现的,它通过代理机制来拦截被注解的方法,从而提供事务支持。但是,如果你通过 `this` 关键字来调用一个方法,那么这个方法就不会被代理拦截,因此 `@Transactional` 注解就会失效。 为了解决这个问题,你可以使用 Spring 的 AOP 代理来保证 `@Transactional` 注解的生效。你可以通过在类级别上声明 `@Transactional` 注解来确保所有的方法都会被代理。例如: ```java @Service @Transactional public class UserServiceImpl implements UserService { @Override public void updateUser(User user) { // ... } } ``` 另外,你也可以将 `@Transactional` 注解放在接口上,然后在实现类中重写接口方法。这样,Spring 会将代理织入到接口方法中,从而保证事务的正确性。例如: ```java @Service @Transactional public class UserServiceImpl implements UserService { @Override public void updateUser(User user) { // ... } } public interface UserService { @Transactional void updateUser(User user); } ``` 最后,你也可以直接使用 Spring事务模板(`TransactionTemplate`)来手动管理事务,而不是依赖于 `@Transactional` 注解。这种方式需要你在代码中显式地开启和提交事务。例如: ```java @Service public class UserServiceImpl implements UserService { private final TransactionTemplate transactionTemplate; public UserServiceImpl(PlatformTransactionManager transactionManager) { this.transactionTemplate = new TransactionTemplate(transactionManager); } @Override public void updateUser(User user) { transactionTemplate.execute(status -> { // ... return null; }); } } ``` 以上是几种解决方法,你可以根据自己的需求来选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值