Spring(四)注解配置Ioc

原文链接:http://www.orlion.ga/216/

一、@Autowired

beans.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: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/context
         http://www.springframework.org/schema/context/spring-context.xsd">

   <context:annotation-config/>
    <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
    </bean>
    
    <bean id="userService" class="ml.orlion.service.UserService">
    </bean>
</beans>

当我们在配置文件中配置了<context:annotation-config/>时,spring会自动帮我们初始化四个bean(AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor)来处理我们在代码中的注解

然后UserService.java:

代码中的注解@Autowired默认是byType,所以beans.xml中不能出现两个类型相同的bean,因为如果类型一致spring就不知道应该注入哪一个了。

package ml.orlion.service;

import org.springframework.beans.factory.annotation.Autowired;

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;

public class UserService {

    private UserDAO userDAO = new UserDAOImpl();

    public UserDAO getUserDao() {
        
        return userDAO;
    }
    @Autowired
    public void setUserDao(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
    
    public void saveUser(User user){
        this.userDAO.saveUser(user);
    }
}

测试一下

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
userService.saveUser(new User());

输出saving user,即成功调用了UserDAOImpl中的save方法

上边的代码有一个限制就是beans.xml中一个类只能配置一个bean,比如beans.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: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/context
         http://www.springframework.org/schema/context/spring-context.xsd">

   <context:annotation-config/>
    <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
    </bean>
    
    <bean id="userDao1" class="ml.orlion.dao.impl.UserDAOImpl">
    </bean>
    
    <bean id="userService" class="ml.orlion.service.UserService">
    </bean>
</beans>

这时候可以把UserService类改成如下(在setUserService方法中加注解)

package ml.orlion.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;

public class UserService {

    private UserDAO userDAO = new UserDAOImpl();

    public UserDAO getUserDao() {
        
        return userDAO;
    }
    @Autowired
    public void setUserDao(@Qualifier("userDao") UserDAO userDAO) {
        this.userDAO = userDAO;
    }
    
    public void saveUser(User user){
        this.userDAO.saveUser(user);
    }
}

这时候再运行就不会报错了。

二、@Reosource

从bean容器中注入bean,默认是按名字查找,找不到再按类型,可以指定名字

beans.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: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/context
         http://www.springframework.org/schema/context/spring-context.xsd">

   <context:annotation-config/>
   
	<bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
	</bean>

	<bean id="userDao1" class="ml.orlion.dao.impl.UserDAOImpl">
	</bean>

	<bean id="userService" class="ml.orlion.service.UserService">
	</bean>
</beans>

UserService.java:

package ml.orlion.service;

import javax.annotation.Resource;

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;

public class UserService {

	private UserDAO userDAO = new UserDAOImpl();

	public UserDAO getUserDao() {

		return userDAO;
	}
	@Resource(name="userDao")
	public void setUserDao(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	public void saveUser(User user){
		this.userDAO.saveUser(user);
	}
}

测试可以运行会输出saving user

三、@Component

将一个类声明为spring的bean

beans.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: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/context
         http://www.springframework.org/schema/context/spring-context.xsd">

   <context:annotation-config/>
   <context:component-scan base-package="ml.orlion"></context:component-scan>
   
</beans>

其中<context:component-scan base-package="ml.orlion"></context:component-scan>表示从包名为ml.orlion下的所有类中找Component.

UserDAOImpl.java

package ml.orlion.dao.impl;

import org.springframework.stereotype.Component;

import ml.orlion.dao.UserDAO;
import ml.orlion.model.User;
@Component("userDao") //默认名字是userDaoImpl
public class UserDAOImpl implements UserDAO{

	public void saveUser(User user){
		System.out.println("save usering");
	}
}

UserService.java

package ml.orlion.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;
@Component("userService")
public class UserService {

	private UserDAO userDAO = new UserDAOImpl();

	public UserDAO getUserDao() {

		return userDAO;
	}
	@Resource(name="userDao")
	public void setUserDao(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	public void saveUser(User user){
		this.userDAO.saveUser(user);
	}
}

测试一下:

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
userService.saveUser(new User());

运行会输出saving user

四、@Scope、@PostConstruct、@PreDestroy

可以在类定义之前添加注释@Scope("prototype")将bean声明为每次调用时都重新new一个。

@PostConstructbean声明在初始化时运行的方法

@PreDestroy声明在销毁时运行的方法

时间: 2024-08-09 21:44:27

Spring(四)注解配置Ioc的相关文章

spring基于注解的IOC(2)

spring第二天:spring基于注解的IOC以及IoC的案例1.spring中ioc的常用注解 用于创建对象的:Component.Controller.Service.Repository 用于注入数据的:Autowired.Qualifier.Resource.Value 用于改变作用范围的:Scope . 和生命周期相关:PreDestroy .PostConstruct 2.案例使用xml方式和注解方式实现单表的CRUD操作 持久层技术选择:dbutils3.改造基于注解的ioc案例

Spring MVC注解配置结合Hibernate的入门教程及其代码实例

原文:Spring MVC注解配置结合Hibernate的入门教程及其代码实例 源代码下载地址:http://www.zuidaima.com/share/1787210045197312.htm 1.概述 本文旨在搭建Spring MVC+Hibernate开发框架,通过一个简单的demo讲解Spring MVC的相关配置文件,以及通过注解方式实现简单功能. 开发框架:Spring+Spring MVC+Hibernate(Spring所用的版本为3.0.5). 数据库:MySQL(数据库名称

四、注解配置IOC、DI

1.注解 @Component 我们这里有个类 Person 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package com.ys.annotation; public class Person {     private int pid;     private String pname;     private String psex;     public int getPid() {       

spring+hibernate注解配置实例

简单的spring3.2.9和hibernate3的集成配置,有demo供下载.shTest下载 第一步 jdbc.properties配置 driverClassName=com.mysql.jdbc.Driver url=jdbc\:mysql\://localhost\:3306/shtest username=root password=123456 prototypeCount=1 maxActive=100 houseKeepingSleepTime=60000 minimumCon

Spring使用注解配置依赖注入

大部分情况下,使用Spring配置依赖注入时,都是使用注解来进行配置,因为注解比xml要方便和简单.不过类似于数据源对象这种配置信息容易变更的对象除外,这种对象使用xml文件来进行配置会更适合,方便于在外部进行修改,而不需要打开代码来进行修改. 接下来简单介绍一下注解的配置方式,首先要让Spring支持注解,编辑Spring配置文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&

Spring AOP 注解配置实例

Spring AOP注解例子 一:导入相关jar包. 首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的) 然后导入AOP注解的相关包(不是spring的包)aspectjrt-1.6.7.jar和aspectjweaver-1.6.8.jar和aopalliance.jar (注意这里最好是1.6.7以上的版本,不然容易出错,折腾了我好久,最后才发现是包的版本问题. 所以这里一定要注意,spring 2.0以后的最好是用1.6.7的版本) 二: 建一个class类作为切入面

关于spring中注解配置的问题

今天写spring的时候,想用注解配置,但不巧的是用Junit工具测试的时候出错了,检查了很久的代码,发现并不是代码的问题,那就有些奇怪了. 后来去百度,回答的奇奇怪怪,和我的问题沾边的不多,最后还是FQ找到的答案,废话不多说,先贴出错误提示: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resou

【spring 事务注解配置】事务回滚

注解配置参考: http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html 自己测试发现事务没成功,原因是 我测试的表是myisam 存储引擎.myisam不支持事务,一个坑 了我! myisam 和 innodb对比 http://www.cnblogs.com/merlini/p/4079313.html

Spring详解(四)------注解配置IOC、DI

1.注解 @Component 我们这里有个类 Person public class Person { private int pid; private String pname; private String psex; public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getPname() { return pname; } public voi