spring5_IOC_3

1、IOC 操作 Bean 管理(基于注解方式)

1.1、什么是注解

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

1.2、Spring 针对 Bean 管理中创建对象提供注解

1@Component2@Service3@Controller4@Repository
上面四个注解功能是一样的,都可以用来创建 bean 实例

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

1.3.1、第一步 引入依赖

在这里插入图片描述其他操作参考demo2

1.3.2、第二步 开启组件扫描(注意,先引入context约束)

<?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:p="http://www.springframework.org/schema/p"
       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">


    <!--开启组件扫描
    注:扫描某个包中的类,看看哪个类上有注解,
    开启组件扫描后,spring才能找到注解;不开启的话,不知道到哪里去找注解部分

     1 如果扫描多个包,多个包使用逗号隔开
        <context:component-scan base-package="com.atguigu.spring5.dao,com.atguigu.spring5.service"></context:component-scan>
     2 扫描包上层目录
        <context:component-scan base-package="com.atguigu"></context:component-scan>
    -->
    <context:component-scan base-package="com.atguigu"></context:component-scan>


</beans>

1.3.3、第三步 创建类,在类上面添加创建对象注解

package com.atguigu.spring5.service;

import com.atguigu.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;




//在注解里面value属性可以省略不写,默认值是类名称,并且首字母小写: UserService -- userService
//当然也可以定义成其他名字(这个value属性就相当于之前bean标签中的id属性,二者是等价的)
//@Component(value = "userService")  //<bean id="userService" class=".."/>
@Service  //四个注解任意一个都可以,自己可以改动一下试一下
public class UserService {
 public void add() {
 System.out.println("service add.......");
 }
}

test部分

    @Test
    public void testService1() {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
                                                    //这个userService就是注解中的value值
        System.out.println(userService);
        userService.add();


//        过程:加载配置文件,在配置文件中只设置了开启组件扫描,spring就知道现在要通过注解方式做
//        然后就到配置的包中找到包中的所有类,如果类上边有相关的注解,那么就会根据注解把相关的对象创建
    }

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

<?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:p="http://www.springframework.org/schema/p"
       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">


    <!--开启组件扫描
    注:扫描某个包中的类,看看哪个类上有注解,
    开启组件扫描后,spring才能找到注解;不开启的话,不知道到哪里去找注解部分

     1 如果扫描多个包,多个包使用逗号隔开
        <context:component-scan base-package="com.atguigu.spring5.dao,com.atguigu.spring5.service"></context:component-scan>
     2 扫描包上层目录
        <context:component-scan base-package="com.atguigu"></context:component-scan>
    -->
    <context:component-scan base-package="com.atguigu"></context:component-scan>


<!--示例 1
     use-default-filters="false" 表示现在不使用默认 filter,而是自己配置 filter
     context:include-filter ,设置扫描哪些内容

     注:1、如果只是像上边这么写,
         <context:component-scan base-package="com.atguigu"></context:component-scan>
            会在spring里有一个默认的filter,默认的filter会扫描包中的所有东西,
          2、如果设置use-default-filters属性,就不扫描所有东西,而是自己设置规则
          比如下边写法:就只会在com.atguigu包中,扫描带Controller注解的类
    -->
<!--
    <context:component-scan base-package="com.atguigu" use-default-filters="false">
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
-->




<!--示例 2
     下面配置扫描包所有内容
     context:exclude-filter: 设置哪些内容不进行扫描
    -->
<!--
    <context:component-scan base-package="com.atguigu">
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
-->



</beans>

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

  • 下面三个是注入对象类型
    @Autowired:
    @Qualifier
    @Resource
  • 下面这一个是注入普通类型
    @Value

(1)@Autowired:根据属性类型进行自动装配
第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解
第二步 在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解

@Service
public class UserService {
 //定义 dao 类型属性
 //不需要添加 set 方法
 //添加注入属性注解
 @Autowired
 private UserDao userDao;
 public void add() {
 System.out.println("service add.......");
 userDao.add();
 }
}

(2)@Qualifier:根据名称进行注入
这个@Qualifier 注解的使用,和上面@Autowired 一起使用

/*
    step1、定义Dao类型属性  ,   不需要添加set方法(因为这个过程在里面帮我们封装了)
    step2、添加注入属性注解
*/

/*
    @Autowired  //根据类型进行注入
    @Qualifier(value = "userDaoImpl1") 根据名称进行注入
                  这个userDaoImpl1是具体那个对象的注解value值
                  (一个接口可能有多个实现类,若有多个实现类,那么根据类型是没法注入的
                  它不知道要找哪个实现类,所以再加个名称就能确定找的是哪一个实现类)
*/
//    private UserDao userDao;


(3)@Resource:可以根据类型注入,可以根据名称注入

/*
        注意:@Resource是  import javax.annotation.Resource;  是Java的扩展包中的
              而@Autowired  和  @Qualifier(value = "userDaoImpl1")  是spring中的
              官方更建议后两种
*/
    //@Resource  //根据类型进行注入
    @Resource(name = "userDaoImpl1")  //根据名称进行注入
    private UserDao userDao;

(4)@Value:注入普通类型属性

    @Value(value = "abc")
    private String name;

整体代码

UserService类

package com.atguigu.spring5.service;

import com.atguigu.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

//在注解里面value属性可以省略不写,默认值是类名称,并且首字母小写: UserService -- userService
//当然也可以定义成其他名字(这个value属性就相当于之前bean标签中的id属性,二者是等价的)
//@Component(value = "userService")  //<bean id="userService" class=".."/>
@Service  //四个注解任意一个都可以,自己可以改动一下试一下
public class UserService {

    @Value(value = "abc")
    private String name;

/*
    step1、定义Dao类型属性  ,   不需要添加set方法(因为这个过程在里面帮我们封装了)
    step2、添加注入属性注解
*/
//    @Autowired  //根据类型进行注入
//    @Qualifier(value = "userDaoImpl1") 根据名称进行注入
//                  这个userDaoImpl1是具体那个对象的注解value值
//                  (一个接口可能有多个实现类,若有多个实现类,那么根据类型是没法注入的
//                  它不知道要找哪个实现类,所以再加个名称就能确定找的是哪一个实现类)
//    private UserDao userDao;





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




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

UserDaoImpl 类

package com.atguigu.spring5.dao;

import org.springframework.stereotype.Repository;

@Repository(value = "userDaoImpl1")//不指明value值,那么默认是类名小写
public class UserDaoImpl implements UserDao {
    @Override
    public void add() {
        System.out.println("dao add.....");
    }

/*

   目的: 在UserService类中调用UserDao中的add方法
   之前是注入外部bean的方式,现在用注解方式做

*/

}

UserDao 接口

package com.atguigu.spring5.dao;

public interface UserDao {
    public void add();
}

test部分

    public void testService1() {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
                                                    //这个userService就是注解中的value值
        System.out.println(userService);
        userService.add();


//        过程:加载配置文件,在配置文件中只设置了开启组件扫描,spring就知道现在要通过注解方式做
//        然后就到配置的包中找到包中的所有类,如果类上边有相关的注解,那么就会根据注解把相关的对象创建
    }

1.6、总结

不管是创建对象,还是注入属性,在bean文件中没有写其他配置,只用了一行配置,
即开启组件扫描配置 而其他部分完全是在用注解方式做到的

1.7、完全注解开发 ,不用配置文件

(1)创建配置类,替代 xml 配置文件

SpringConfig 类

package com.atguigu.spring5.config;

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

@Configuration  //在一个类上边加一个  @Configuration 作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.atguigu"})  //相当于配置文件中的开启组件扫描,这里用注解做到
public class SpringConfig {
}

(2)编写测试类

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值