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();
}
}