通过注解配置bean

0.jar包:
spring-aop-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar

1.概述

相对于XML方式而言,通过注解的方式配置bean更加简洁和优雅,而且和MVC组件化开发的理念十分契合,
是开发中常用的使用方式

2.使用注解标识组件

2.1.1 普通组件: @Component
标识受Spring IOC 容器管理的组件

2.1.2 持久化层组件: @Repository
标识受Spring IOC 容器管理的持久化层组件

2.1.3 业务逻辑层组件: @Service
标识受Spring IOC 容器管理的业务逻辑层组件

2.1.4 表述层控制器组件: @Controller

2.1.5 组件命名规则

  • 1.默认情况: 使用组件的简单类名首字母小写后得到的字符串作为bean的id
  • 2.使用组件注解的value属性指定bean的id

注意: 事实上Spring并没有能力识别组件是不是它所标识的类型,
即使将@Repository 注解用在一个表述层控制器组件上也不会产生任何错误.
所以,@Repository @Service @Controller这几个注解仅仅是为了开发人员自己明确当前的组件扮演的角色。

控制层接收请求,调用service处理业务逻辑,再调用dao来实现持久化.

3.

3.1 Controller.java

package com.moon.ioc.userMod.controller;

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

import com.moon.ioc.userMod.service.UserService;
import com.moon.ioc.userMod.service.UserServiceImpl;

@Controller
public class UserController {
	
	/*private UserService userService = new UserServiceImpl();*/
	
	//基于注解的自动装配
	@Autowired
	private UserService userService;
	
	public void addUser() {
		userService.addUser();
	}
	
	public UserController() {
		// TODO Auto-generated constructor stub
		System.out.println("UserController");
	}
}


3.2 dao包:
UserDaoImpl.java

package com.moon.ioc.userMod.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDaoImpl implements UserDao {
	public UserDaoImpl() {
		System.out.println("UserDaoImpl:添加成功");
	}

	@Override
	public void addUser() {
		// TODO Auto-generated method stub
		System.out.println("添加成功!");
	}
}

UserDao.java

package com.moon.ioc.userMod.dao;

public interface UserDao {

	void addUser();
}

UserDaoMybatisImpl .java

package com.moon.ioc.userMod.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDaoMybatisImpl implements UserDao {

	@Override
	public void addUser() {
		// TODO Auto-generated method stub
		System.out.println("UserDaoMybatisImpl:添加成功");
	}
	
}

3.3 service包:

UserServiceImpl


package com.moon.ioc.userMod.service;

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

import com.moon.ioc.userMod.dao.UserDao;
import com.moon.ioc.userMod.dao.UserDaoImpl;

/**
 * 当有多个UserDao实现类时,自动装配的注解,需要添加一个额外的注解: @Qualifier
 * 
 * @author Administrator
 *
 */
@Service
public class UserServiceImpl implements UserService{
	/*private UserDao userDao = new UserDaoImpl();*/
	
	//基于注解的自动装配
	@Autowired
	@Qualifier(value="userDaoImpl")
	private UserDao userDao;
	
	public UserServiceImpl() {
		System.out.println("UserServiceImpl");
	}

	@Override
	public void addUser() {
		// TODO Auto-generated method stub
		userDao.addUser();
	}
}

UserService .java

package com.moon.ioc.userMod.service;

public interface UserService {

	void addUser();
}

3.4 配置文件: user.xml

3.4.1 需要先添加一下: context命名空间:

3.4.2

<?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-4.0.xsd">
	
	<!-- 基于注解使用 
		
		扫描组件,即在设置的包下面的类进行扫描,会将加上注解的类作为spring的组件进行加载
		组价:指spring中管理的bean
		作为spring的组件进行加载 会自动在spring的配置文件中生成相对应的bean.
		这些bean的id会以类的首字母小写开头的值 比如: userController
		
		<context:include-filter>在设定的包结构下 再次通过注解或类型具体包含某个或某几个类
		注意:在使用包含时 一定要设置use-default-filters="false" 将默认的过滤(即扫描包下所有的类)关闭
		可以写多个包含
		<context:exclude-filter>在设定的包结构下 再次通过注解或类型排除某个或某几个类
		注意:在使用包含时 一定要设置use-default-filters="true" 将默认的过滤(即扫描包下所有的类)打开
		可以多个排除.
		但是包含和排除不能同时使用
	-->
	<context:component-scan base-package="com.moon.ioc.userMod" use-default-filters="true">
		<!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> -->
		<!-- <context:include-filter type="assignable" expression="com.moon.ioc.userMod.controller.UserController"/> -->
		<!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
		<!-- <context:exclude-filter type="assignable" expression="com.moon.ioc.userMod.dao.UserDaoImpl"/> -->
	</context:component-scan>	
	
</beans>

3.5 测试代码:Test.java

package com.moon.ioc.userMod;

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

import com.moon.ioc.userMod.controller.UserController;
import com.moon.ioc.userMod.dao.UserDao;
import com.moon.ioc.userMod.dao.UserDaoImpl;
import com.moon.ioc.userMod.service.UserService;
import com.moon.ioc.userMod.service.UserServiceImpl;

//使用注解
//可以通过注解的value值指定生成的bean的id.
//@Repository(value="r1")
//只设置一个属性值value,可以省略 value= 写成 @Repository("aa")

public class Test {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("user.xml");
		//加上注解通过Spring自动生成的bean的id是以该类名的首字母小写开头
		UserController uc = ac.getBean("userController",UserController.class);
		System.out.println(uc);
		
		UserService us = ac.getBean("userServiceImpl",UserServiceImpl.class);
		System.out.println(us);
		
		UserDao ud = ac.getBean("userDaoImpl",UserDaoImpl.class);
		System.out.println(ud);
		
		uc.addUser();
	}
}

通过注解配置bean

上一篇:Windows 10 任务栏软件图标右键不显示最近打开 解决方案


下一篇:第二次SDN实验