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

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

总结: 注解注入属性的方式不用提供setter方法

什么是注解
  1. 注解是代码特殊标记,格式是:@注解名称(属性名称=属性值,属性名称=属性值...)
  2. 使用注解,注解作用在类上面,方法上面,属性上面
  3. 使用注解目的,简化xml配置
Spring针对Bend管理中创建对象提供四个注解【非常重要】
  1. @Component:可以作用在任何层中
  2. @Service:作用于@service
  3. @Controller:作用于Controller
  4. @Repository:作用于Dao

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

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

步骤:

  1. 导入jar依赖spring-aop
  2. 开启组件扫描
  3. 创建类,在类上添加创建对象注解

开启组件扫描:配置

开启组件扫描需要添加:context命名空间
xmlns:context="http://www.springframework.org/schema/context"
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context.xsd



使用`context: component-scan base-package`属性


<!--
        3.使用命名空间:开启注解扫描
            方式一:"com.haikang.dao,com.haikang.service"  多个包之间用`逗号`隔开
            方式二:扫描包上层目录:    com.haikang
    -->
<!--    <context:component-scan base-package="com.haikang.dao,com.haikang.service"/>-->
    <context:component-scan base-package="com.haikang"/>

案例:

UserService

package com.haikang.service;

import org.springframework.stereotype.Service;

/**
 * @Author 海康
 * @Version 1.0
 */
@Service(value = "userService")//相当于:<bean id="userService" class="全路径"
/**
 * 注意:value可以省略不定
 * 默认是类名称,首字母变小写
 * UserService --> userService
 */
public class UserService {
    public void service(){
        System.out.println("service......");
    }
}

xml文件【重要】

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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
                                                                                                                 ">
<!--
    使用注解创建对象:
    1.导入jar包是: spring-aop包
    2.引入命名空间:context
         xmlns:context="http://www.springframework.org/schema/context"
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    3.使用命名空间:开启注解扫描
-->
    <!--
        3.使用命名空间:开启注解扫描
            方式一:"com.haikang.dao,com.haikang.service"  多个包之间用`逗号`隔开
            方式二:扫描包上层目录:    com.haikang
    -->
<!--    <context:component-scan base-package="com.haikang.dao,com.haikang.service"/>-->
    <context:component-scan base-package="com.haikang"/>
</beans>

test

  @Test
    public void test(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        userService.service();
    }
注解扫描的细节
 <!--
        use-default-filters:
            默认是true,表示扫描base-package="com.haikang"下包类
            设置false,表示不扫描,需要我们设置扫描才会扫描
            context:include-filter:
                表示只扫描type="annotation"包含: `@Controller`注解的类
            
    -->
    <context:component-scan base-package="com.haikang" use-default-filters="false">
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--
        context:exclude-filter 
            表示 `不` 扫描type="annotation"包含:`@Controller`注解的类
    -->
    <context:component-scan base-package="com.haikang">
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

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

对象类型注入三个注解【注意只对对象类型注入】
  1. @Autowired:根据属性类型进行自动装配

  2. @Qualifier:根据名称进行注入

    注意是:@Qualifier注解必须要和@Autowired一起使用

  3. @Resource:可以根据类型注入,也可以根据名称注入【注意不是spring中的注解,是javax扩展包注解】

@Autowired注解

案例:

在`UserService类中使用到`dao`层的UserDao中的方法

步骤:

  1. UserService类和UserDao接口及子类创建,并在UserService类和UserDao子类中注解相应注解
  2. UserService注入UserDao对象,在UserService类添加UserDao类型属性,在属性上面使用注解

UserDao接口

public interface UserDao {
    public void dao();
}

UserDaoImpl实现类

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

UserService

@Service(value = "userService")//相当于:<bean id="userService" class="全路径"
/**
 * 注意:value可以省略不定
 * 默认是类名称,首字母变小写
 * UserService --> userService
 */
public class UserService {
    使用注解注入对象属性
    @Autowired
    private UserDao userDao;

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

test

@Test
    public void test(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        userService.service();
    }
@Qualifler注解

使用@Qualifler注解必须与@Atuowired注解一起使用

使用场景,当一个接口中有多个实现类,一个类中有多个子类,就可以使用Qualifler注解指定是用那个进行注入

UserDaoImpl

// 注解上的value可以省略,默认就是该类名,首字母变小写

// @Repository( value = "userDaoImpl")
// value可以省略
public class UserDaoImpl implements UserDao{
    @Override
    public void dao() {
        System.out.println("userDao......");
    }
}

UserService

public class UserService {
    @Autowired
    @Qualifier("userDaoImpl")
    private UserDao userDao;

    public void service(){
        System.out.println("service......");
        userDao.dao();
    }
}
@Resource注解

可以根据类型注入,也可以根据名称注入

注意是:@Resource不是Spring中的注解,是javax包的注解

UserDaoImpl

// 注解上的value可以省略,默认就是该类名,首字母变小写

@Repository( value = "userDaoImpl")
// value可以省略
public class UserDaoImpl implements UserDao{
    @Override
    public void dao() {
        System.out.println("userDao......");
    }
}

UserService

@Service(value = "userService")//相当于:<bean id="userService" class="全路径"
/**
 * 注意:value可以省略不定
 * 默认是类名称,首字母变小写
 * UserService --> userService
 */
public class UserService {

    //@Resource// 表示根据类型进行注入
    @Resource(name = "userDaoImpl")
    private UserDao userDao;


    public void service(){
        System.out.println("service......");
        userDao.dao();
    }
}
普通属性注入@value注解
@Service(value = "userService")//相当于:<bean id="userService" class="全路径"
/**
 * 注意:value可以省略不定
 * 默认是类名称,首字母变小写
 * UserService --> userService
 */
public class UserService {
    @Value("海康")
    private String name;

    //@Resource// 表示根据类型进行注入
    @Resource(name = "userDaoImpl")
    private UserDao userDao;


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

报错:1. No bean named 'userDaoImfpl' available表示该bean没有找到,2.No qualifying bean of type 'com.haikang.dao.UserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: 表示该接口至少需要一个实现类

完全注解开发【重点】

使用步骤:

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

    在配置类中需要使用到两个注解
    1.`@Configuration  //表示作为配置类,替代xml配置文件
    2.`@ComponentScan(baswPackages = {"需要扫描的包"})`
    
  2. 编写测试类

配置类:

/**
 * @Author 海康
 * @Version 1.0
 */
@Configuration
@ComponentScan(basePackages = {"com.haikang"})//表示扫描`haikang下所有类`
public class MyConfig {
}

编写测试类:

@Test
    public void test2(){
        ApplicationContext context =
                new AnnotationConfigApplicationContext(MyConfig.class);
        UserService userService = context.getBean("userService", UserService.class);
        userService.service();
    }

注意是: AnnotationConfigApplicationContext(Class<T> class),传入配置类的类字节码

总结: 注解注入属性的方式不用提供setter方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值