<Spring>IOC操作Bean管理(基于注解方式)-4

1、什么是注解

(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值,…)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的,简化xml配置

2、Spring针对Bean管理中创建对象提供注释

(1)@Component:标注一个普通的Spring Bean类
(2)@Service:标注一个控制器组件类
(3)@Controller:标注一个业务逻辑组件类
(4)@Repository:标注一个DAO组件类

上述四个注解功能是一样的,都可以用来创建bean实例

3、基于注解方式实现对象创建

(1)引入依赖
在这里插入图片描述
(2)开启组件扫描

这一步就是告知Spring容器当前需要在哪个类里面加上注解

(3)引入名称空间context

在这里插入图片描述

如果扫面多个包,可以逗号隔开

    <!--组件扫描,指明扫描哪个包中的哪个类中,看是否有注解-->
    <context:component-scan base-package="service,dao,springDemo3"></context:component-scan>

(4)创建类,在类上面添加创建对象注释

UserService

package service;

import org.springframework.stereotype.Component;

@Component(value = "userService1")
//在注解里面value如果不写,那么默认值就是类名称,同时首字母小写
//eg: UserService---userService
public class UserService {
    public void add()
    {
        System.out.println("service add....");
    }
}

4、开启组件扫描细节配置

(1)设置扫描的指定内容

<context:component-scan base-package="dao" use-default filters="false">
 <use-default filters="false" type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

use-default filters="false",加了这一句,就不会扫描指定包中的所有内容,而是自己定义规则

use-default filters="false",设置扫描哪些内容

expression="org.springframework.stereotype.Controller,只扫描注解是Controller的内容

(2)设置不扫描的指定内容

<context:component-scan base-package="com.atguigu">
 <context:exclude-filter type="annotation" 
 
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

context:exclude-filter,这里是exclude,因此是不包含,上述语句就是不扫描注解是Controller的语句

5、基于注解方式实现属性注入

(1)@Autowired:根据属性类型进行自动装配
(2)@Qualifier:根据属性名称进行注入
(3)@Resource:可以根据类型注入,可以根据名称注入
(4)@Value:注入普通类型属性

(1)(2)(3)是注入对象类型
(4)是普通类型

示例1

dao包中有UserDao接口,UserDaoImpl类

UserDao接口

package dao;

public interface UserDao {
    public void add();
}

UserDaoImpl类

package dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDaoImpl implements UserDao {
    public void add()
    {
        System.out.println("UserDaoImpl add...");
    }
}


在UserDao接口的实现类UserDaoImpl添加了@Repository

service包中有UserDaoImpl类

package service;

import dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Component(value="userService1")
@Service

//在注解里面value如果不写,那么默认值就是类名称,同时首字母小写
//eg: UserService---userService
public class UserService {
    @Autowired
    private UserDao userDao;

    public void add()
    {
        System.out.println("service add....");
        userDao.add();
    }
}

在Service中添加了注解@Service,@Autowired

示例2:

由于一个接口可以有多个实现类,假如进行多个UserDao的实现类还使用Autowired进行类型注入的话,就导致不知道是该注入哪个类型,因此需要根据名称进行注入,使用@Qualifier 注解@Qualifier 注解的使用,和上面@Autowired一起使用

在示例1的基础上进行修改,在实现类UserDaoImpl的注解@Repository,在其后面指定名称user1在这里插入图片描述

然后在类UserService中的@Autowired下面添加@Qualifier(value = "user1")
在这里插入图片描述

示例3

@Resource:可以根据类型注入,可以根据名称注入
//@Resource //根据类型进行注入
@Resource(name = "userDaoImpl1") //根据名称进行注入
private UserDao userDao; 

示例4

@Value:注入普通类型属性
@Value(value = "abc")
private String name;

6、完全注解开发

@Configuration: 把当前类作为配置类,替代xml配置文件

springConfig类

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration   //把当前类作为配置类,替代xml配置文件
@ComponentScan(basePackageClasses = {"SpringDemo3"})  //替代配置文件中的<context:component-scan base-package="SpringDemo3"></context:component-scan>
public class springConfig {
}

测试类

package testDemo;

import config.springConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;

public class testConfig {
    @Test
    public void testService(){
        //使用配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService",UserService.class);
        System.out.println(userService);
        userService.add();
    }

    @Test
    public void testService2(){
        // 加载配置类
        ApplicationContext context = new AnnotationConfigApplicationContext(springConfig.class);
        UserService userService = context.getBean("userService",UserService.class);
        System.out.println(userService);
        userService.add();
    }
}






  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值