当前位置: 首页 > article >正文

Spring IOC容器Bean对象管理-注解方式

目录

1、Bean对象常用注解介绍

2、注解示例说明


1、Bean对象常用注解介绍

  1. @Component 通用类组件注解,该类被注解,IOC容器启动时实例化此类对象
  2. @Controller 注解控制器类
  3. @Service 注解业务逻辑类
  4. @Respository 注解和数据库操作的类,如DAO类
  5. @Resource 装配注解,优先按名称装配,如果名称匹配不上,则按照类型匹配
  6. @Autowired 装配注解,按类型装配(Spring 内置)
  7. @Inject 装配注解,按类型装配(JSR-330标准)
  8. @PostConstruct 方法注解,功能参考xml文件中的init-method,在实例化对象后自动执行
  9. @Scope Bean属性注解,功能参考xml文件中的Scope属性,非WEB环境有多例和单例两种,注解不写value或者不写此注解的情况下,默认是单例
  10. @Value 属性注解,为Bean对象注入静态数据,通常属性注入的值来自某个配置文件

2、注解示例说明

IOC容器注解方式配置Bean需要如下步骤:

1、applicationContext.xml加入扫描的包,此包项下的类被IOC容器扫描,如有注解,则实例化对象

    <!-- 扫描注解包-->
    <context:component-scan base-package="com.text"/>
    <!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:config.properties"/>

        配置文件config.properties(示例jdbc连接)                

jdbc.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx

 2、配置Bean注解

package com.text.dao.impl;
import com.text.dao.StudentDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@Repository
@Scope("prototype") //多例,只是程序模拟,实际项目上大部分是单例
public class StudentDaoImpl implements StudentDao {
    @Value("${jdbc.url}")
    private String url;
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}
package com.text.service.impl;
import com.text.dao.StudentDao;
import com.text.service.StudentService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class StudentServiceImpl implements StudentService {

    /**
     * @Resource 注解后,先从容器中找bean名称=studentDao的对象,没找到(系统中实例对象名称是studentDaoImpl)
     * 再通过类型StudentDao寻找,找到studentDaoImpl,注入到studentServiceImpl对象中
     * 由于studentDao是私有属性,IOC容器会通过反射技术将studentDao改为puclic属性(修改modifier值),
     * 然后赋值,赋值后再次将studentDao设置私有属性;此种方式和xml中的property的方式不同,property的方式是通过
     * 反射调用SetStudentDao方法实现注入
     */
    @Resource
    private StudentDao studentDao;
    public StudentDao getStudentDao() {
        return studentDao;
    }
    public void setStudentDao(StudentDao studentDao) {
        this.studentDao = studentDao;
    }
}

测试类:

package com.text.entity;

import com.text.dao.StudentDao;
import com.text.dao.impl.StudentDaoImpl;
import com.text.service.impl.StudentServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        String configLocation = "classpath:applicationContext.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
        System.out.println("==========IOC容器完成初始化==========");
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for(String beanDefinitionName:beanDefinitionNames) {
            System.out.println(beanDefinitionName);//studentDaoImpl  studentServiceImpl
        }
        StudentDao studentDao1 = context.getBean("studentDaoImpl", StudentDao.class);
        StudentServiceImpl studentService = context.getBean("studentServiceImpl", StudentServiceImpl.class);
        StudentDao studentDao2 = studentService.getStudentDao();
        System.out.println(studentDao1 == studentDao2);//false,studentDaoImpl scope=多例
        StudentDaoImpl studentDao3 = (StudentDaoImpl)studentService.getStudentDao();
        System.out.println(studentDao3.getUrl());//jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx
    }
}

 特别说明:

@Resource 注解StudentServiceImpl 后,先从容器中找bean名称=studentDao的对象,没找到(系统中实例对象名称是studentDaoImpl)再通过类型StudentDao寻找,找到studentDaoImpl,注入studentServiceImpl对象的studentDao属性中,由于studentDao是私有属性,IOC容器会通过反射技术将studentDao改为puclic属性(修改modifier值),然后赋值,赋值后再次studentDao设置私有属性;此种方式和xml中的property的方式不同,property的方式是通过反射调用SetStudentDao方法


http://www.kler.cn/news/316865.html

相关文章:

  • 每日一题——第九十四题
  • pywinauto:Windows桌面应用自动化测试(十)
  • 成都睿明智科技有限公司怎么样?
  • 【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架
  • Shader 中的光源
  • 民主测评系统可以解决哪些问题?
  • Typescript进阶:解锁Infer类型的使用
  • C++笔记---set和map
  • NLP--自然语言处理学习-day1
  • 《微信小程序实战(3) · 推广海报制作》
  • 文件系统(软硬链接 动静态库 动态库加载的过程)
  • C++学习笔记(32)
  • 在C#中使用NPOI将表格中的数据导入excel中
  • 工业交换机如何保证数据的访问安全
  • SkyWalking 简介
  • 深入理解Go语言中的并发封闭与for-select循环模式
  • 使用脚本自动化管理外部Git仓库依赖
  • 如何基于Flink CDC与OceanBase构建实时数仓,实现简化链路,高效排查
  • MySQL面试题——第一篇
  • 人工智能不是人工“制”能
  • FreeSWITCH 简单图形化界面29 - 使用mod_xml_curl 动态获取配置、用户、网关数据
  • 寻呼机爆炸,炸醒通讯安全警惕心
  • 【操作系统强化】王道强化一轮笔记
  • k8s1.27.7部署higress,代理非k8s集群业务
  • 如何借助ChatGPT提升论文质量:实战指南
  • 真正能抵抗裁员的,从不是专业能力,早知道这些都财务自由了
  • JAVA_17
  • pSort
  • < 微积分Calculus >
  • 【自学笔记】支持向量机(3)——软间隔