spring框架学习05——注解配置bean

1.注解配置组件类型
@Component:标识一个受spring IOC容器管理的组件。
@Repository:标识一个受spring IOC容器管理的持久化层组件。
@Service:标识一个受spring IOC容器管理的业务逻辑层组件。
@Controller:标识一个受spring IOC容器管理的表述层控制器组件。

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

注:spring没有能力识别一个组件是不是它所标记的类型,所以以上四个组件在功能上没有区别。但是为了提高代码可读性,需要将不同功能的组件标上不同的注解,以明确当前组件扮演的角色。

一般的三层模型
控制层@Controller 接收请求
业务逻辑层@Service 处理业务逻辑
持久化层@Repository 实现数据持久化

请求打到Controller层,经过Service层到Dao层,再逐层返回响应到客户端。

利用@Autowired注解进行自动装配,优先使用byType策略,如果失败使用byName策略,再失败报错。
@Autorwired属性:required默认为true
表示是否必须装配该属性,装配不成功true时抛出异常,false时保持null,继续运行

可以在@Autowired注解后用@Qualifier(value = “”)指定用哪个bean进行自动装配。value处填写bean的id,原理是作用于set的形参来注入。

demo:
控制层

package class02.usermod.controller;

import class02.usermod.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    public void addUser() {
        userService.addUser();
    }

    public UserController() {
        System.out.println("UserController");
    }
}

服务层

package class02.usermod.service;

import class02.usermod.dao.UserDao;
import class02.usermod.dao.UserDaoImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService{

    /**
     * 用@Qualifier(value = " ")指定用哪个具体的bean为userDao注入
     */
    @Autowired
    @Qualifier(value = "userDaImpl")
    private UserDao userDao;

    @Override
    public void addUser() {
        userDao.addUser();
    }

    public UserServiceImpl() {
        System.out.println("UserServiceImpl");
    }
}

持久化层

package class02.usermod.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDaoImpl implements UserDao {

    @Override
    public void addUser() {
        System.out.println("UserDaoImpl:添加成功");
    }

    public UserDaoImpl() {
        System.out.println("UserDaoImpl");
    }
}

在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.xsd">

    <!--  <context:component-scan>:扫描组件,在设置的包下面,对加上注解的类作为spring组件进行加载  -->
    <!--  即在spring的配置文件中生成对应的bean,这些bean的id会以类的首字母小写为值  -->
    <!--  base-package处可填入多个包,用逗号分隔  -->
    <context:component-scan base-package="class02.usermod"/>

<!--    效果相当于-->
<!--    <bean id="userController" class="class02.usermod.controller.UserController"></bean>-->
<!--    <bean id="userDaoImpl" class="class02.usermod.dao.UserDaoImpl"></bean>-->
<!--    <bean id="userServiceImpl" class="class02.usermod.service.UserServiceImpl"></bean>-->

    <!--  <context:include-filter>用法:包括指定的包  -->
    <!--  use-default-filters意为全扫描  -->
    <!--  需要保证use-default-filters="false"  -->
    <!--  可选annotation根据注解扫描或assignable根据类型扫描  -->
<!--    <context:component-scan base-package="class02.usermod" use-default-filters="false">-->
<!--        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
<!--        <context:include-filter type="assignable" expression="class02.usermod.service.UserServiceImpl"/>-->
<!--    </context:component-scan>-->

    <!--  <context:exclude-filter>用法:排除指定的包  -->
    <!--  需要保证use-default-filters="true"或缺省该属性  -->
<!--    <context:component-scan base-package="class02.usermod">-->
<!--        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->
<!--        <context:exclude-filter type="assignable" expression="class02.usermod.dao.UserDaoImpl"/>-->
<!--    </context:component-scan>-->

    <!--  每个context:component-scan中可以有多个include-filter或多个exclude-filter  -->
    <!--  但include-filter和exclude-filter不能同时出现  -->
</beans>

测试类

package class02.usermod;

import class02.usermod.controller.UserController;
import class02.usermod.dao.UserDao;
import class02.usermod.dao.UserDaoImpl;
import class02.usermod.dao.UserDaoMybatisImpl;
import class02.usermod.service.UserService;
import class02.usermod.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    /**
     * @Component,@Controller(控制层),@Service(业务层),@Repository(持久层)
     * 以上四个注解功能完全相同,在实际开发中要在实现不同功能的类上加上相应的注解
     * 完成组建的自动化管理:
     * 1.在需要被spring管理的类上加相应注解
     * 2.在xml配置文件中用<context:component-scan>写注解扫描器
     * 这样会在spring配置文件中自动生成相应的bean,并以首字母小写的类名字符串为id的值(在注解处加value可以改变bean的值)
     *
     * 在需要赋值的非字面量属性上加@Autowired可以实现自动装配,会先按照byType匹配(要求至少有一个bean能为其赋值)
     * 失败会用byName匹配(要求有一个bean的id和属性名完全一致),仍然失败就会报错
     * 可以在@Qualified(value = " ")根据id指定用来装配该属性的bean
     * 可以用@Autowired和@Qualified给一个方法注解,此时注解指定的bean作用于函数的形参,与方法名无关
     */

    public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext("user.xml");

        // 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);

        System.out.println();
        uc.addUser();
    }
}

输出:
UserController
UserServiceImpl
UserDaoImpl
class02.usermod.controller.UserController@4009e306
class02.usermod.service.UserServiceImpl@43c1b556
class02.usermod.dao.UserDaoImpl@587e5365

UserDaoImpl:添加成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值