Spring基础(八):注解方式创建对象IOC

举报
Lansonli 发表于 2022/12/26 13:13:17 2022/12/26
【摘要】 ​注解方式创建对象IOC一、注解方式创建对象IOC导入依赖 aop@Component 放在类上,用于标记,告诉spring当前类需要由容器实例化bean并放入容器中该注解有三个子注解@Controller 用于实例化controller层bean@Service 用于实例化service层bean@Repository 用于实例化持久层bean当不确定是哪一层,就用Component这几个...

注解方式创建对象IOC

一、注解方式创建对象IOC

导入依赖 aop

@Component 放在类上,用于标记,告诉spring当前类需要由容器实例化bean并放入容器中

该注解有三个子注解

@Controller 用于实例化controller层bean

@Service 用于实例化service层bean

@Repository 用于实例化持久层bean

当不确定是哪一层,就用Component

这几个注解互相混用其实也可以,但是不推荐

1、在applicationContext.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:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       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
">
    <!--添加注解扫描,扫描指定的包,将包中的所有有注解的类实例化
    base-package 后面放要扫描的包
    如果有多个包需要扫描,可以使用逗号隔开  com.lanson.bean,com.lanson.service
    或者可以写上一层包路径  com.lanson
    可以通过注解指定bean的id@Component("user1")
    如果不指定,则id默认是 类名首字母小写
    -->
    <context:component-scan base-package="com.lanson.bean"></context:component-scan>
</beans>


2、在类上添加注解,让spring容器给我们创建bean实例并存储于容器中

package com.lanson.bean;
import org.springframework.stereotype.Component;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@Component(value = "user1")
public class User {
}


3、测试代码

package com.lanson.test;
import com.lanson.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class Test1 {
    @Test
    public void testGetBean(){
        ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("user1", User.class);
        System.out.println(user);
    }
}


4、组件扫描配置注解识别

<!--
    use-default-filters="false"
    默认值为true 代表使用默认的扫描过滤器
    默认的扫描过滤器会识别并包含 @Component @Controller @Service @Repository 四个注解
    不使用默认的filter,使用我们自己的filter
-->
    <!--控制只扫描Controller注解-->
    <context:component-scan base-package="com.msb" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!--控制不扫描Controller注解-->
    <context:component-scan base-package="com.msb" use-default-filters="true">
        <context:exclude-filter  type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>


二、注解方式依赖注入DI

@Autowired 根据属性数据类型自动装配

@Qualifier 根据属性名称注入依赖

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

@Value 注入普通数据类型(8+String)

项目结构如下

applicationContext.xml中配置包扫描和读取属性配置文件

Dao层接口

实现类

让容器扫描 Service层,实例化对象接口

实现类

package com.lanson.service.impl;
import com.lanson.dao.UserDao;
import com.lanson.service.UserService;
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.Service;
import javax.annotation.Resource;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@Service
public class UserServiceImpl implements UserService {
    /*
    *@Autowired
    * 根据类型到容器中去寻找对应的对象,找到后给当前属性赋值
    * 不需要依赖 set方法
    * 属性类型可以是接口,会自动匹配对应的实现类对象
    * @Autowired配合 @Qualifier,可以通过名称指定注入的对象
    *
    * @Resource 如果不配置name 那么就是根据类型注入
    * @Resource(name="userDaoImplB") 配置name,就是根据名称注入
    *
    *
    * @Resource  是JDK中javax包的注解
    * @Autowired 和 @Qualifier 是spring中的注解
    *
    * @Value 可以个普通属性赋值
    * @Value 可以使用${}这种表达式获取系统的变量值
    *        或者是.properties属性配置文件中的值
    *
    * */
    //@Autowired
    //@Qualifier("userDaoImplA")
    //@Qualifier("userDaoImplB")
    //private UserDao userDao ;
    @Resource(name="userDaoImplB")
    private UserDao userDao ;
    @Value("${username}")
    private String sname;
    @Value("boy")
    private String sgender;
    @Value("${age}")
    private Integer sage;
    @Override
    public void add() {
        System.out.println("userServiceImpl add ... ... ");
        System.out.println(sname);
        System.out.println(sgender);
        System.out.println(sage);
        userDao.add();
    }
}

测试代码

package com.lanson.test;
import com.lanson.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class Test1 {
    @Test
    public void testGetBean(){
        ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean("userServiceImpl", UserService.class);
        userService.add();
    }
}

三、完全使用注解

创建配置类,替代XML配置文件

测试代码

@Test
public void testGetBean2(){
    ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
    UserServiceImpl userService = context.getBean("userServiceImpl", UserServiceImpl.class);
    userService.add();
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。