Spring学习笔记三之IOC(annotation实现)

原创 2013年12月04日 21:56:32

上一篇中我是通过配置文件来实现Spring的IOC,但是有一种更加方便的方式来实现IOC,那就是注解(annotation ),这样会使的我们编程更加的方便,可以提高编程的效率。一般我们比较常用到的注解主要有这些:

@Autowired  @Qualifier  @Resource @Component

 

使用注解时首先要先修改beans.xml的头部,添加一行:

xmlns:context="http://www.springframework.org/schema/context"

在xsi:schemaLocation中加入:

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

所以beans.xml可以写为:

<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/>
</beans>

一.@Autowired的使用

beans.xml中:

<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="u" class="com.limitvic.dao.impl.UserDaoImpl">
</bean>
<bean name="userService" class="com.limitvic.service.UserService">
</bean>
</beans>

Service中:

@Autowired
public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

在方法上面加一个@Autowired,就可以把配置文件中的u给注入进去了,要注意的是@Autowired是按照类型来注入的。但如果在beans.xml中要是出现了连个相同类型的对象,比如说:

<beanid="u1"class="com.limitvic.dao.impl.UserDaoImpl">

<beanid="u2"class="com.limitvic.dao.impl.UserDaoImpl">

这时候Service层里面就应该这样子写:

@Autowired
	public void setUserDao(@Qualifier("u1")UserDao userDao) {
		this.userDao = userDao;
	}

@Qualifier来显性的指定注入哪一个对象。

 

二.@Resource的使用

在beans.xml中

<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="com.limitvic.dao.impl.UserDaoImpl">
</bean>
<bean name="userService" class="com.limitvic.service.UserService">
</bean>
</beans>

Service层中:

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

@Resource是优先按照名称来进行装配的,但是如果没有指定名称的话就会按照类型来进行装配。一般情况下,@Resource的使用会比@Autowired来的多。

三.@Component

  从上面的两种方式看来还是没有从根本上解决问题,因为在beans.xml如仍然需要说明

<beanid="userDao"class="com.limitvic.dao.impl.UserDaoImpl">

</bean>

<beanname="userService"class="com.limitvic.service.UserService">

</bean>

这两个语句,所以我们这里用@Component来把这两个语句给去掉。

beans.xml中:

<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="com.limitvic"></context:component-scan>
</beans>


<context:component-scan base-package="com.limitvic"></context:component-scan>

这句意思是扫描com.limitvic下面的所有包,当发现有用到@Component注解的类的时候,将该类放在一个容器里头,@Component这个注解从名字上可以看出来是将一个个类弄成一个个构建,然后可以用来组装。

dao.impl

package com.limitvic.dao.impl;
import org.springframework.stereotype.Component;
import com.limitvic.dao.UserDao;
import com.limitvic.domain.User;
@Component("u")
public class UserDaoImpl implements UserDao{
    private int id;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Override
	public void save(User user) {
		// TODO Auto-generated method stub
		System.out.println("已保存"+user.getUsername()+"的用户信息");
		System.out.println("id="+id);
	}
}

将该类指定为一个组件,命名为u。

service层中:

package com.limitvic.service;

import javax.annotation.Resource;

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

import com.limitvic.dao.UserDao;
import com.limitvic.dao.impl.UserDaoImpl;
import com.limitvic.domain.User;
@Component("userService")
public class UserService {
	private UserDao userDao;
	public void add(User user) throws Exception{
		userDao.save(user);
	}
	public UserDao getUserDao() {
		return userDao;
	}
	@Resource(name="u")
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
}

将该类指定为一个组件:userService并通过@Resourceu注入进来。

test文件中

BeanFactory factory = newClassPathXmlApplicationContext("beans.xml");

UserService userService =(UserService)factory.getBean("userService");

同样可以获得注入进来的userService

然后就大功告成啦。


Java 学习笔记05:Spring 基于注解(Annotation)的IOC

@Resource 使用,修饰setter方法,将目标对象注入到依赖的Bean。说白了,就是你在一个User类中 比如要调用 Vip类,你用了注解,就不需要每次实例化来调用这个Vip类然后再User类...
  • initphp
  • initphp
  • 2012年11月16日 15:12
  • 1450

Spring学习笔记 使用annotation配置实现Bean的auto-wiring (自动绑定)

使用@Autowired标注来进行porperty与Bean的auto-wiring。 准备 首先要使用@Autowired需要在spring-config.xml 中增加配置,一般有两种方式: ...

基于annotation注解的Spring3 MVC Page Redirection Example之三页面重定向学习笔记

com.jiangge.common.controller.WebController package com.jiangge.common.controller; import org.sprin...

Spring学习3—控制反转(IOC)基于Annotation(注解)的依赖注入实现

Spring学习3—控制反转(IOC)基于Annotation(注解)的依赖注入实现

Spring学习笔记二之IOC(xml实现)

今天正式开始学习Spring,Spring主要分为两大块,一个是IOC,一个是AOP,IOC相对于AOP来说比较简单,所以先从IOC学起,实现IOC分为两种方式,一中是通过配置文件,另外一种是通过注解...

J2EE系列之Spring4学习笔记(三)--IOC详解(依赖注入)

现在讲一下如何通过Spring装配一个对象实例,并给对象中的属性赋值。 1.新建一个工程:Spring402-02 2.新建一个类People: package com.test.entity;...

Spring IOC Annotation 注入 学习实例

  • 2016年12月16日 17:14
  • 6.32MB
  • 下载

Spring Annotation 笔记——IOC篇

@Autowired  1、Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明...

Spring学习笔记(三)- Spring IoC容器启动源码分析

在上节Spring学习笔记(三)- Spring IoC容器分析 分析过,IoC过程主要分为两个阶段:IoC容器启动和依赖注入。本节内容我们重点就从源码的角度来分析这两个过程。一、IoC容器启动过程I...

基于annotation注解的Spring3 MVC Form Handling Example之二表单提交学习笔记

com.jiangge.common.controller.Student package com.jiangge.common.controller; public class Student {...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring学习笔记三之IOC(annotation实现)
举报原因:
原因补充:

(最多只允许输入30个字)