基于注解(@Autowired)的自动装配
1.项目目录
2.UserController.java
package com.atguigu.ioc.userMod.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.atguigu.ioc.userMod.service.UserService;
import com.atguigu.ioc.userMod.service.UserServiceImpl;
/**
* 基于注解的组件化管理:
* @Component,@Controller(控制层),@Service(业务层),@Repository(持久曾)
* 以上四个注解功能完全相同,不过在实际开发中,要在实现不同功能的类上加上相应的注解
* 完成组件化管理的过程:
* 1、在需要被spring管理的类上加上相应注解
* 2、在配置文件中通过<context:component-scan>对所设置的包结构进行扫描,就会将加上注解的类作为spring的组件进行加载
* 组件:指spring中管理的bean
* 作为spring的组件进行加载:会自动在spring的配置文件中生成相对应的bean,这些bean的id会以类的首字母小写为值;
* 也可以通过@Controller("beanId")为自动生成的bean指定id
*
* 自动装配:在需要赋值的非字面量属性上,加上@Autowired注解,就可以在spring容器中,通过不同的方式匹配到相对应的bean
* @Autowired装配时,会默认使用byType的方式,此时要求spring容器中只有一个能够为其赋值
* 当byType实现不了装配时,会自动切换到byName,此时要求spring容器中,有一个bean的id和属性名一致
* 若自动装配时,匹配到多个能够赋值的bean,可使用@Qualifire(value="beanId")指定使用的bean
* @Autowired和@Qualifire(value="beanId")可以一起作用于一个带形参的方法上,此时,@Qualifire(value="beanId")所
* 指定的bean作用于形参
*
*/
@Controller
//@Controller(value="aaa")//为自动创建的bean设置id
public class UserController {
//private UserService userService = new UserServiceImpl();
@Autowired//基于注解的自动装配(根据类型进行自动装配 byType)
private UserService userService;
public void addUser(){
userService.addUser();
}
public UserController() {
System.out.println("UserController");
}
}
3.UserService.java
package com.atguigu.ioc.userMod.service;
public interface UserService {
void addUser();
}
4.UserServiceImpl.java
package com.atguigu.ioc.userMod.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.atguigu.ioc.userMod.dao.UserDao;
import com.atguigu.ioc.userMod.dao.UserDaoImpl;
@Service
public class UserServiceImpl implements UserService{
//private UserDao userDao = new UserDaoImpl();
@Autowired
//@Qualifier(value="userDaoImpl")
@Qualifier(value="userDaoMybatisImpl")
private UserDao userDao;
// @Autowired
// @Qualifier(value="userDaoMybaticImpl")
// public void setUserDao(UserDao userDao){
// this.userDao = userDao;
// }
public UserServiceImpl() {
System.out.println("UserServiceImpl");
}
@Override
public void addUser() {
// TODO Auto-generated method stub
userDao.addUser();
}
}
5.UserDao.java
package com.atguigu.ioc.userMod.dao;
public interface UserDao {
void addUser();
}
6.UserDaoImpl.java
package com.atguigu.ioc.userMod.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao{
public UserDaoImpl(){
System.out.println("UserDaoImpl");
}
@Override
public void addUser() {
System.out.println("添加成功");
}
}
7.UserDaoMybatisImpl.java
package com.atguigu.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("UserDaoMybatisImple:添加成功");
}
}
8.user.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-4.0.xsd">
<!--
<context:component-scan>:扫描组件,对设置的包下面的类进行扫描,会将加上注解的类作为spring的组件进行加载
组件:指spring中管理的bean
作为spring的组件进行加载:会自动在spring的配置文件中生成相对应的bean,这些bean的id会以类的首字母小写为值
<context:include-filter>:在设定的包结构下再次通过注解或类型具体包含到某个或某几个类
注意:在使用包含时,一定要设置use-default-filters="false",将默认(即扫描包下所有的类)的过滤关闭
<context:exclude-filter>:在设定的包结构下,再次通过注解或类型具体排除某个或某几个类
注意:在使用排除时,一定要设置use-default-filters="true",将默认(即扫描包下所有的类)的过滤打开
切记:一个<context:component-scan>中可以出现多个include,也可以同时出现多个exclude,但是两个不能同时出现
-->
<context:component-scan base-package="com.atguigu.ioc.userMod" use-default-filters="true">
<!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> -->
<!-- <context:include-filter type="assignable" expression="com.atguigu.ioc.userMod.service.UserServiceImpl"/> -->
<!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
<!-- <context:exclude-filter type="assignable" expression="com.atguigu.ioc.userMod.dao.UserDaoImpl"/> -->
</context:component-scan>
<!-- <bean id="userController" class="com.atguigu.ioc.userMod.controller.UserController"></bean>
<bean id="userServiceImpl" class="com.atguigu.ioc.userMod.service.UserServiceImpl"></bean>
<bean id="userDaoImpl" class="com.atguigu.ioc.userMod.dao.UserDaoImpl"></bean> -->
<!-- 测试@Autowired是根据类型来进行自动装配的(byType) -->
<!-- <bean id="user" class="com.atguigu.ioc.userMod.dao.UserDaoImpl"></bean> -->
<!-- 如果根据类型自动装配失败,则byName -->
<!-- <bean id="userDao" class="com.atguigu.ioc.userMod.dao.UserDaoImpl"></bean> -->
</beans>
9.Test.java
package com.atguigu.ioc.userMod;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.atguigu.ioc.userMod.controller.UserController;
import com.atguigu.ioc.userMod.dao.UserDao;
import com.atguigu.ioc.userMod.dao.UserDaoImpl;
import com.atguigu.ioc.userMod.service.UserService;
import com.atguigu.ioc.userMod.service.UserServiceImpl;
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("user.xml");
UserController uc = ac.getBean("userController", UserController.class);
System.out.println(uc);//com.atguigu.ioc.userMod.controller.UserController@4b553d26
UserService us = ac.getBean("userServiceImpl", UserServiceImpl.class);
System.out.println(us);//com.atguigu.ioc.userMod.service.UserServiceImpl@69a3d1d
UserDao ud = ac.getBean("userDaoImpl", UserDaoImpl.class);
System.out.println(ud);//com.atguigu.ioc.userMod.dao.UserDaoImpl@86be70a
uc.addUser();
}
}
10.运行结果
UserController
UserServiceImpl
UserDaoImpl
com.atguigu.ioc.userMod.controller.UserController@6f195bc3
com.atguigu.ioc.userMod.service.UserServiceImpl@51e2adc7
com.atguigu.ioc.userMod.dao.UserDaoImpl@1a8a8f7c
添加成功