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

Spring框架中的bean管理(XML和注解及属性的注入)

Spring框架中IOC就是将创建对象的权力反转给Spring框架,我们无需自己创建对象,直接在Spring框架的容器中获取即可。

bean中配置的就是需要让Spring管理的类。


XML的bean管理 

先写个“HelloWorld”:

    <bean id="User" class="com.ffyc.spring.model.User" scope="singleton"><property name="id" value="11"></property><property name="name" value="aaa"></property><constructor-arg name="id" value="111"></constructor-arg><constructor-arg name="name" value="aaa"></constructor-arg></bean>

上面代码的含义就是创建单例的User对象,并且实现了依赖注入。bean依赖注入的两种方式:一种是属性的set方法注入(property标签),通过Java反射机制(所以前提是User类中必须存在当前属性的set方法),为属性赋值。另一种是构造方法的注入(constructor-arg标签),通过类中的构造方法赋值。

以上代码描述了通过bean标签实现通过Spring创建对象并赋值,称为依赖注入(Dependency Injection)DI。

在实际开发中并没有如此简单,例如在一个类中调用另一个类,使用bean标签该如何处理呢?

public class UserService {UserDao userDao;public void saved(){userDao.save();}
}
    <bean id="UserDao" class="com.ffyc.spring.Dao.UserDao"></bean><bean id="UserService" class="com.ffyc.spring.Service.UserService"><property name="userDao" ref="UserDao"></property></bean>

如上我们新建UserDao类和UserService类,在UserService类中调用UserDao类中的方法,使用bean管理这两个类。

使用XML我们发现工作量太大,如果模块很多,那每次加入一个模块就要添加一个bean。


使用注解进行bean管理 

<context:component-scan base-package="com.ffyc.spring"></context:component-scan>

在Spring中配置当前标签,就可以通过注解,自动扫描指定包下的类,可自动解析注解。

模型类: 

@Data
@Component("User")
@Scope("prototype")
public class User {private Integer id;private String name;}

数据访问层: 

@Data
@Repository("userDao")
public class UserDao {public void save() {System.out.println("保存成功!");}
}

Service层: 

@Data
@Service("userService")
public class UserService {@Autowired   //属性的注入@Qualifier("userDao")UserDao userDao;public void saved(){userDao.save();}
}

各层类使用不同的注解标签和名字。在Spring框架中,一般把由Spring框架管理创建的对象称为一个bean对象,与我们普通的对象不同,因为Spring框架可以进行功能上的增强。

补充:Spring为了每层更加清晰,(为了后续的扩展功能,在不同层使用不同的注解标记)

模型类:@Compontent

Service层:@Service 

数据访问层:@Repository

Spring中注解的自动注入:

两种方式:

1,@Autowired Spring框架中提供的注解标签,可以提供两种方式进行属性注入。

①bean名称注入 @Qualifier(value="bean名称")

@Data
@Service("userService")
public class UserService {@Autowired   //属性的注入@Qualifier("userDao")UserDao userDao;public void saved(){userDao.save();}
}
@Data
@Repository("userDao")
public class UserDao {Integer id;String name;public void save() {System.out.println("保存成功!");}
}

②属性类型注入,如果没有指定名称,那么就是属性类型去容器中查找对应类型对象(常用)

@Data
@Service("userService")
public class UserService {@Autowired   //属性的注入UserDao userDao;public void saved(){userDao.save();}
}
@Data
@Repository
public class UserDao {Integer id;String name;public void save() {System.out.println("保存成功!");}
}

 2,@Resource JDK提供的注解标签

没有给定指定名称,就通过类型查找注入,若给定,则通过名称注入

@Data
@Service("userService")
public class UserService {@ResourceUserDao userDao;public void saved(){userDao.save();}
}
@Data
@Repository
public class UserDao {Integer id;String name;public void save() {System.out.println("保存成功!");}
}
http://www.lryc.cn/news/234184.html

相关文章:

  • MySQL 存储过程提高数据库效率和可维护性
  • JAXB的XmlElement注解
  • 竞赛选题 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python
  • 59 权限提升-Win溢出漏洞及ATSCPS提权
  • 【新闻稿】Solv 与 zCloak 联合开发跨境贸易场景下可编程数字凭证项目,获得新加坡、加纳两国央行支持...
  • requests库进行爬虫ip请求时遇到的错误解决方法
  • 目标检测—YOLO系列(二 ) 全面解读论文与复现代码YOLOv1 PyTorch
  • Redis维护缓存的方案选择
  • LeetCode236. Lowest Common Ancestor of a Binary Tree
  • 基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
  • 【开源】基于Vue和SpringBoot的固始鹅块销售系统
  • Windows11怎样投屏到电视上?
  • ubuntu中用docker部署jenkins,并和码云实现自动化部署
  • for,while,do-while,死循环,嵌套循环,跳转关键字,随机数
  • 【六袆 - MySQL】SQL优化;Explain SQL执行计划分析;
  • 【AI视野·今日NLP 自然语言处理论文速览 第六十二期】Wed, 25 Oct 2023
  • 各种符号地址,可以直接复制粘贴使用
  • C语言测试题:用冒泡法对输入的10个字符由小到大排序 ,要求数组做为函数参数。
  • uni-app开发微信小程序 vue3写法添加pinia
  • centos三台主机配置互信ssh登录
  • 验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
  • js/jQuery 的一些常用操作(js/jQuery获取表单元素值 以及 清空元素值的各种实现方式)——附测试例子,拿来即能实现效果
  • h5(react ts 适配)
  • 计算机视觉:驾驶员疲劳检测
  • Vue向pdf文件中添加二维码
  • idea一键打包docker镜像并推送远程harbor仓库的方法(包含spotify和fabric8两种方法)--全网唯一正确,秒杀99%水文
  • 程序设计:C++11原子 写优先的读写锁(源码详解二:操作跟踪)
  • Django视图层解析
  • JAVA使用RXTXcomm进行串口通信(一)
  • Vue+ElementUI技巧分享:自定义表单项label的文字提示