Bean 容器
为什么要使用Bean容器
因为希望减少new的操作,这样当我们的类名发生改变时,影响会降到最小
Bean相当于一个管家
原来需要我们自己new的对象现在统统通过Bean来创建
怎么使用Bean?
首先我们需要利用pom.xml来建立对于spring的依赖
关于pom.xml是Maven的知识
这里不做赘述
<!-- Spring 依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.22.RELEASE</version> </dependency>
创建了spring依赖之后
我们还需要创建一个xml文件,这个xml文件就是用来配置Bean容器的
<?xml version="1.0" encoding="UTF-8"?> <!--该文件配置Maven中的Bean文件--> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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 ">
这是xml的基本信息,对于后缀为context的命令现在可以暂时忽略,后续会再介绍
然后就是配置Bean
对于每一个实现类我们都要配置一个Bean来和他对应
例如
<bean id="userDaoimpl" class="com.demo.Dao.impl.UserDaoimpl"/>
这里的id是bean 的ID ,后续我们通过bean来创建对象,就是通过这个id来寻找对应的Bean的
class对应的就是具体的实现类,注意一定要是实现类,因为我们创建对象都是实体类对象,没有接口对象
这里bean还有其他参数
例如
scope 这个参数用来表示Bean创建的对象是否是单例对象
如果是单例对象,那么每个bean只能创建一个对象,其余的都是对这个对象的引用
换而言之
就是无论创建多少对象,这些对象有着相同的地址
如果不是单例对象,那么不同对象有着不同的地址
配置好了一个Bean
下面就是如何利用Bean来创建对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDaoimpl)applicationContext.getBean("userDaoimpl"); userDao.setId("123"); System.out.println(userDao.getId());
有几个需要注意的地方
首先是
ClassPathXmlApplicationContext("applicationContext.xml")里边的参数
这里参数就是我们配置Bean文件的xml文件
其次我们可以用接口来指向实现对象,这是JAVA的内容,这里不做赘述
但是要在接口中声明相应的方法
然后就是getBean("userDaoimpl") 里边的参数就是我们前边提到的bean的id
这样我们通过Bean来创建一个对象就成功了
在实际开发中,我们并不会只单一的创造一个类
实际上是类与类之间有很多依赖关系
例如在UserServiceimpl.java中我们需要用到UserDao对象
这个时候我们不需要在UserServiceimpl利用上述的代码来创建
我们可以在xml中配置UserServiceimpl时配置相应的依赖关系
<bean id="userServiceimpl" class="com.demo.Sevice.impl.UserServiceimpl"> <!-- 为了避免在Service中new Dao对象,需要配置Service和Dao的依赖关系--> <!-- 首先name是指UserServiceimpl中变量的名称 这里的name必须有set方法与之对应--> <!-- propery表示配置当前bean属性--> <!-- ref表示参照哪一个bean 相当于一个映射 ref = beanId--> <!-- 可以有多个property 存在多个依赖关系--> <!-- ref是对类的映射,Value是常规数据类型的设置--> <property name="userDao" ref="userDaoimpl"/> </bean>
注意一点 ref中的变量是已经配置好的bean的id
然后在UserServiceimpl必须有setName的方法
这是通过set方法来进行配置UserDao对象
我们也可以通过构造器来配置
<bean id="userServiceimpl" class="com.demo.Sevice.impl.UserServiceimpl"> <!-- 为了避免在Service中new Dao对象,需要配置Service和Dao的依赖关系--> <!-- 首先name是指UserServiceimpl中变量的名称 这里的name必须有set方法与之对应--> <!-- propery表示配置当前bean属性--> <!-- ref表示参照哪一个bean 相当于一个映射 ref = beanId--> <!-- 可以有多个property 存在多个依赖关系--> <!-- ref是对类的映射,Value是常规数据类型的设置--> <property name="userDao" ref="userDaoimpl"/> <!-- <property name="name" value="haha"/>--> <!-- 构造方法注入 如果没有set方法 就不用使用ref依赖传值 那么可以通过构造器传值--> <!-- 第一行是通过形参名字传值--> <!-- 第二行是通过数据类型传值--> <!-- 第三行通过参数位置传参--> <!-- <constructor-arg name="userDao" ref="userDaoimpl"/>--> <!-- <constructor-arg type="java.lang.String" value="haha"/>--> <!-- <constructor-arg index="1" value="haha"/>--> </bean>
当然为了简化开发
spring提供了自动依赖
<bean id="userServiceimpl" class="com.demo.Sevice.impl.UserServiceimpl" autowire="byType"/>
通过byType来建立依赖 那么只需要有对应的类的bean
通过bYName来建立依赖 那么对应的类的Bean的id一定要和变量名相同
例如:UserServiceimpl有一个 private UserDao userDao 那么UserDao对应的实现类的id一定要为userDao
现在自己创建的类的Bean以及如何建立相互的依赖我们已经清楚了
下面介绍怎么创建别人写好的类bean
回到一开始我们说的xml文件中的context
实际上就是一个新的命名空间,为了防止命名重复问题(个人理解哈)
然后我们创建相应的Bean就可以了
以链接数据库为例
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean>
然后和创建Dao对象一样
根据id来创建就可以了
当然我们也可以把property写在同一个文件中中 然后在xml中加载就可以了
<!--加载context命名空间--> <!-- 使用context命名加载propert配置文件--> <!-- System 是否加载系统的properties --> <context:property-placeholder location="classpath*:*.property" system-properties-mode="NEVER"/> <!-- 注意配置component-scan是在context中配置-->
到这里 关于bean的基础用法就说完了
下面会介绍纯注解开发
然后上边说的这一堆都没用了
标签:xml,JAVA,对象,Spring,bean,Bean,创建,id From: https://www.cnblogs.com/zzRh-5479/p/16739218.html