栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

`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`属性




    

案例:

UserService

package com.haikang.service;

import org.springframework.stereotype.Service;


@Service(value = "userService")//相当于:
    public void service(){
        System.out.println("service......");
    }
}

xml文件【重要】




    

    

test类

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

    
    
        
    
基于注解方式实现属性注入 对象类型注入三个注解【注意只对对象类型注入】
  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")//相当于:
    使用注解注入对象属性
    @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")//相当于:

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


    public void service(){
        System.out.println("service......");
        userDao.dao();
    }
}
普通属性注入@value注解
@Service(value = "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. 编写测试类

配置类:

@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 class),传入配置类的类字节码

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/881215.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号