Spring注释,散集积累(三)

本文对比了Spring框架的传统XML配置方式与注解方式,详细解释了两种配置方式的区别,并介绍了如何在不同层级(如Action、Service、Dao)使用Spring注解进行组件注册。此外,文章还讨论了`@Scope(prototype)`的作用以及如何避免找不到组件的错误。通过实例代码,深入浅出地展示了Spring框架中组件的依赖注入与生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Configuration

传统方式:

 

<beans>  
	<bean id="orderService" class="com.acme.OrderService"/>  
		<constructor-arg ref="orderRepository"/>  
	</bean>  
	<bean id="orderRepository" class="com.acme.OrderRepository"/>  
		<constructor-arg ref="dataSource"/>  
	</bean>  
</beans>  

 

 

ApplicationContext ctx = new ClassPathXmlApplicationContext("application-config.xml");  
OrderService orderService = (OrderService) ctx.getBean("orderService");  
 注解方式:

 

@Configuration  
public class ApplicationConfig {  
  
		public @Bean OrderService orderService() {  
				return new OrderService(orderRepository());  
		}  
  
		public @Bean OrderRepository orderRepository() {  
				return new OrderRepository(dataSource());  
		}  
  
		public @Bean DataSource dataSource() {  
				// instantiate and return an new DataSource …  
		}  
}  

 

JavaConfigApplicationContext ctx = new JavaConfigApplicationContext(ApplicationConfig.class);  
OrderService orderService = ctx.getBean(OrderService.class);  

 

 

@Scope("prototype")

 

@Scope("prototype")  
public class PrintTask2 implements Runnable {  
        String name;  
  
        public void setName(String name) {  
                this.name = name;  
        }  
          
        @Override  
        public void run(){  
                System.out.println(name + " is running.");  
                try{  
                        Thread.sleep(5000);  
                }catch(InterruptedException e){  
                        e.printStackTrace();  
                }  
                System.out.println(name + " is running again.");  
        }  
} 

 

 

如果action或Service中不@Scope("prototype"),有可能报找不到xxxaction或Service的错误!写上这个就表示每次请求都重新创建一个action或Service,与SINGALON对应,俗称“多例”。

@Component

 

@Component  
@Scope("prototype")  
public class PrintTask2 implements Runnable {  
        String name;  
  
        public void setName(String name) {  
                this.name = name;  
        }  
          
        @Override  
        public void run(){  
                System.out.println(name + " is running.");  
                try{  
                        Thread.sleep(5000);  
                }catch(InterruptedException e){  
                        e.printStackTrace();  
                }  
                System.out.println(name + " is running again.");  
        }  
}

把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>

 

@Repository

 

@Repository
public class DaoImpl implements IDao{
}

 应用于Dao层,把该类注册到Spring容器中

 

 

@Service

 

@Service
public class ServiceImpl implements IService {
	@Autowired
	private IDao iDao;  
}

 应用于Service层,把该类注册到Spring容器中

 

 

@Controller

 

@Controller
public class TestController {
    @Autowired
    private IService iService;
}

  应用于Action层,把该类注册到Spring容器中

 

@Autowired , @Qualifier("XXX")

 

@Service  
public class TestServiceImpl {  
    @Autowired  
    @Qualifier("iTestDao2")  
    private ITestDao iTestDao;  
}  

在ITestDao接口标上@Autowired@Qualifier注释使得ITestDao接口存在两个实现类的时候必须指定其中一个来注入,使用实现类首字母小写的字符串("iTestDao2")来注入。否则可以省略,只写@Autowired  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值