IOC之基于注解的配置讲解

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以取代XML配置文件。开发人员对注解(Annotation)的态度也是萝卜青菜各有所爱,个人认为注解可以大大简化配置,提高开发速度,同时也不能完全取代XML配置方式,XML方式更加灵活,并且发展的相对成熟,这种配置方式为大多数 Spring开发者熟悉;注解方式使用起来非常简洁,但是尚处于发展阶段,XML配置文件和注解(Annotation)可以相互配合使用。

1. @Component

使用@Component注解定义的Bean,默认的名称(id)是小写开头的非限定类名。如这里定义的Bean名称就是userDaoImpl。你也可以指定Bean的名称:

@Component("userDao")
@Component是所有受Spring管理组件的通用形式

package com.mucfc.daoimp;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import com.mucfc.dao.UserDao;
import com.mucfc.model.User;
@Component("userDao")
public class UserDaoImp implements UserDao{
	@Override
	public void add(User user) {
		System.out.println(user.getName());
        System.out.println(user.getSex());
        System.out.println(user.getAge());
	}

}

相当于定义了一个bean:

	<bean id="userDao" class="com.mucfc.UserDaoImp"/>

因为没有配置,我们必须告诉Spring容器启用类扫描机制并自动注入了:

	 <!-- 配置的bean所在包的位置 -->
	<context:component-scan base-package="com.mucfc" />

1)@Component有个可选参数,指定Bean的名称@Component(“beanId”)
2)与@Component配合使用,可以通过@Scope指定Bean的作用范围,比如:@Scope(“prototype”)

用法还是和以前一样

2、其他注释
Spring除了提供@Component注释外,还定义了几个注释:@Repository、@Service 和 @Controller。
在目前的Spring 2.5中,这3个注释和@Component是等效的,但是从注释类的命名上,很容易看出这3个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这3个注释和@Component相比没有什么新意,但Spring将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository、@Service和 @Controller对分层中的类进行注释,而用@Component对那些比较中立的类进行注释。

最后来看个例子吧。

User.java:

package com.mucfc.model;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

@Repository("user")
@Scope("prototype")
//@Repository用于标注数据访问组件,即DAO组件
//@Scope("prototype")让其每次返回不同的实例,默认是单例
public class User {
	private String name;
	private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	private int age;
}

Userdao.java

package com.mucfc.dao;

import com.mucfc.model.User;

public interface UserDao {
	public void add(User user);
}

UserDaoImp.java

package com.mucfc.daoimp;

import org.springframework.stereotype.Controller;

import com.mucfc.dao.UserDao;
import com.mucfc.model.User;

@Controller("userDao")
//@Controller用于标注控制层组件
public class UserDaoImp implements UserDao{

	@Override
	public void add(User user) {
		System.out.println(user.getName());
        System.out.println(user.getSex());
        System.out.println(user.getAge());
	}

}

UserService.java

package com.mucfc.service;
import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.mucfc.dao.UserDao;
import com.mucfc.model.User;

@Service("userService")
//@Service用于标注业务层组件
public class UserService {
	 //setter注入接口、面向接口编程
    private UserDao userdao ;
    public void add(User user){
        userdao.add(user) ;
    }
    public UserDao getUserdao() {
        return userdao;
    }
    //注解
    @Resource(name="userDao")
    public void setUserdao(UserDao userdao) {
        this.userdao = userdao;
    }
}

配置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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	 <!-- 配置的bean所在包的位置 -->
	<context:component-scan base-package="com.mucfc" />

</beans>

最后就是来测试下啦:

package com.mucfc.anno;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mucfc.model.User;
import com.mucfc.service.UserService;

public class Test {

	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
		UserService service=(UserService)applicationContext.getBean("userService");
		User user1 = (User) applicationContext.getBean("user");
		User user2 = (User) applicationContext.getBean("user");
		user1.setName("小明");
		user1.setSex("男");
		user1.setAge(22);

		user2.setName("小红");
		user2.setSex("女");
		user2.setAge(18);

		service.add(user1);
		service.add(user2);
	}

}

来看看结果:

@Service用于标注业务层组件

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

时间: 2024-10-08 01:09:06

IOC之基于注解的配置讲解的相关文章

【Spring】IOC之基于注解的配置bean

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.基于注解的配置 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这3 个注

【Spring】IOC之基于注解的配置bean(下)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.@Autowired注解 Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法.Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 Aut

(spring-第4回)spring基于注解的配置

基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现类上标注注解实现. 也就是说,加了注解,相当于在XML中配置了,一样一样的. 一.举个栗子: 1 package com.mesopotamia.annotation; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class Car { 7 private

Spring框架bean的配置(3):基于注解的配置,Autowired 自动装配 Bean,泛型依赖注入

1.基于注解的配置: @Component: 基本注解, 标识了一个受 Spring 管理的组件 @Respository: 标识持久层组件 @Service: 标识服务层(业务层)组件 @Controller: 标识表现层组件 建立接口:UserRepository package com.atguigu.spring.beans.annotation.test; public interface UserRepository { void save(); } 建立类:UserReposito

spring基于注解和配置源码解读

我们先来建立一个maven项目,引入spring文件,不爱弄的在文章最下面有代码地址可以去下载.先看,后面自己下载代码自己去尝试.先给你们吧,边尝试边看吧. 一.IOC容器注册组件的方式 1. 基础XML注入Bean 是不是超级简单的,我们由浅入深一点点来. 2. 基于注解的方式来配置 我们通过方法名就可以直接得到我们的对象了,默认就是按照方法来装配.也可以通过@Bean(value="newName") 来指定装配的名字. 3. 按照包扫描的方式装配(重点),使用@Component

使用Spring框架入门二:基于注解+XML配置的IOC/DI的使用

一.简述 本文主要讲使用注解+xml配合使用的几种使用方式.基础课程请看前一节. 二.步骤 1.为Pom.xml中引入依赖:本例中使用的是spring-context包,引入此包时系统会自动导入它的依赖包spring-beans\spring-core\spring-expression\spring-context. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:

java Spring 基于注解的配置(一)

注解引用:1.service.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://w

Bean的基于注解的配置方式

Boss.class import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; import org.springframework.stereotype.Component; @Component public class Boss { public Boss(){ System.out.println("construct...&qu

Spring基于注解的配置之@Autowired

学习地址:https://www.w3cschool.cn/wkspring/rw2h1mmj.html @Autowired注释 @Autowired注释对在哪里和如何完成自动连接提供了更多的细微控制. Setter方法中的@Autowired SpellChecker.java: package com.lee.autowired; public class SpellChecker { public SpellChecker() { System.out.println("Inside S