victory的博客

长安一片月,万户捣衣声

0%

spring | 基于注解的自动装配

基于注解(@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
添加成功