Bean
在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。同样,在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化Bean有三种方式
-
构造器实例化
-
静态工厂实例化
-
实例工厂实例化
获取bean的三个方式
-
根据id获取
-
根据name获取
-
根据类型获取
//都是通过ApplicationContext.getBean的方式
context.getBean("id");
context.getBean("name");
context.getBean("id",Class.class);
拓展
如果一个类实现了接口,那可以根据接口类型获取bean吗
可以,但是前提是bean唯一
如果一个接口有多个实现类,这些实现类都配置了bean,可以根据接口类型获取bean吗
不可以,因为bean不唯一
-
<bean>标签
bean的本质是类,
Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理Bean
Spring容器支持Properties文件和xml文件
-
用于定义一个由Spring容器管理的对象
-
告诉Spring:创建并管理这个类的实例
-
id::定义唯一标识符
-
class:指定全类名
-
name:类似id,表示Bean,但可以指定多个别名(,; 空格)
-
scope:指定bean的声明周期,默认是singleton
-
prototype:原型:每次获取Bean都是一个新实例
-
scope默认是singleton单例
-
request:在一次请求中,是单例对象
-
session:在一次会话中,是单例对象
-
application:整个应用的运行当中只有一个Bean实例
-
-
注入和赋值
-
类有属性:创建对象的过程中,向属性设置值
-
setter注入
-
构造器注入
-
//原生写法就是
public Class Student{
private String studentName;
private String studentClass;
//setter和getter方法
………………
//有参和无参构造器
………………
}
public Class Main{
public void static main(String[] args){
Student s = new Student();
//set方法注入
s.setStudentName("狗蛋er");
//构造方法注入
Student s = new Student("狗蛋儿","一年级");
}
}
setter注入
-
创建User类
public class User { private String name; private String gender; public String getGender() { return gender; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", gender='" + gender + '\'' + '}'; } public void setGender(String gender) { this.gender = gender; } public User(String name, String gender) { this.name = name; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User(String name) { this.name = name; System.out.println("有参构造器被调用"); } public User() { System.out.println("无参构造了"); } } -
配置
<bean id="user5" class="com.baor.pojo.User"> <property name="gender" value="男"/> <property name="name" value="狗蛋儿"/> </bean> -
测试
@Test
public void testSet(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean03.xml");
User user = context.getBean("user5", User.class);
System.out.println("user = " + user);
}
//user = User{name='狗蛋儿', gender='男'}
构造器注入
<!-- 构造器方法-->
<bean id="user6" class="com.baor.pojo.User">
<constructor-arg name="gender" value="男"/>
<constructor-arg name="name" value="狗剩儿"/>
</bean>
@Test
public void testSet(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean03.xml");
User user = context.getBean("user6", User.class);
System.out.println("user = " + user);
}
无参构造了
有参构造了
user = User{name='狗剩儿', gender='男'}
在此期间发现,明明用的user6但是没有删除的user5也会无参构造一下,
想到 Spring 容器在初始化时,会创建所有定义的单例 bean
所以可以将作用域改成原型(scope="prototype")这样它只会在被显式获取时才会创建
特殊值处理
-
字面量赋值
spring会 把value的值看做字面量
-
null值
<bean id="user5" class="com.baor.pojo.User" scope="prototype">
<property name="gender" value="男"/>
<property name="name">
<null/>
</property>
</bean><!-- null值处理 -->
-
xml实体
-
转义字符
-
< <
-
> >
-
& &
-
-
-
CDATA节
-
![CDATA[a<b]]表示里面的特殊符
-
为对象类型属性赋值
员工类
@Data
public class Emp {
private Dept dept;
private String eName;
private Integer eAge;
public void work(){
System.out.println(eName+"在工作"+"年龄:"+eAge);
}
}
部门类
@Data
public class Dept {
private String dName;
public void info(){
System.out.println("部门的名称"+dName);
}
}
-
引入外部Bean
<!-- 引入外部bean 1.创建两个类的对象 2.在emp的bean标签里面,使用property引入dept的bean--> <bean id="dept" class="com.baor.pojo.Dept"> <property name="DName" value="安保部"></property> </bean> <bean id="emp" class="com.baor.pojo.Emp"> <!-- 普通类型注入--> <property name="EName" value="luck"/> <property name="EAge" value="12"/> <!-- 注入对象类型--> <property name="dept" ref="dept"/> </bean> -
引入内部Bean
<bean id="emp" class="com.baor.pojo.Emp">
<!-- 普通类型注入-->
<property name="ename" value="luck"/>
<property name="eage" value="12"/>
<!-- 注入对象类型-->
<property name="dept">
<bean id="dept" class="com.baor.pojo.Dept">
<property name="DName" value="安保部"></property>
</bean>
</property>
</bean>
-
级联赋值
<bean id="dept" class="com.baor.pojo.Dept">
</bean>
<bean id="emp" class="com.baor.pojo.Emp">
<!-- 普通类型注入-->
<property name="ename" value="luck"/>
<property name="eage" value="12"/>
<!-- 注入对象类型-->
<property name="dept" ref="dept"/>
<property name="dept.DName" value="测试部"/>
</bean>
这个需要实体类中有get方法
-
数组类型属性赋值
<bean id="emp" class="com.baor.pojo.Emp">
<property name="ename" value="狗蛋"/>
<property name="eage" value="12"/>
<property name="dept">
<bean id="dept" class="com.baor.pojo.Dept">
<property name="DName" value="测试部"/>
</bean>
</property>
<property name="loves">
<array>
<value>吃饭</value>
<value>睡觉</value>
<value>敲代码</value>
</array>
</property>
</bean>
-
List集合类型
<bean id="empone" class="com.baor.pojo.Emp">
<property name="ename" value="小杨"/>
<property name="eage" value="12"/>
<property name="loves">
<array>
<value>打豆豆</value>
<value>吃饭</value>
<value>打球</value>
</array>
</property>
<property name="dept" ref="dept"/>
</bean>
<bean id="emptwo" class="com.baor.pojo.Emp">
<property name="ename" value="小娴"/>
<property name="eage" value="14"/>
<property name="loves">
<array>
<value>读书</value>
<value>看报</value>
<value>吃零食</value>
</array>
</property>
<property name="dept" ref="dept"/>
</bean>
<bean id="dept" class="com.baor.pojo.Dept">
<property name="DName" value="技术部"/>
<property name="empList">
<list>
<ref bean="empone"/>
<ref bean="emptwo"/>
</list>
</property>
-
Map集合类
<bean id="dept1" class="com.baor.pojo.Dept">
<property name="DName" value="技术部"/>
<property name="DId" value="1"/>
</bean>
<bean id="dept2" class="com.baor.pojo.Dept">
<property name="DName" value="测试部"/>
<property name="DId" value="2"/>
</bean>
<bean id="emp1" class="com.baor.pojo.Emp">
<property name="ename" value="样杨艺群"/>
<property name="eage" value="23"/>
<property name="loves">
<array>
<value>吃饭</value>
<value>睡觉</value>
<value>打豆豆</value>
</array>
</property>
<property name="deptMap">
<map>
<entry key="1" value-ref="dept1"/>
<entry key="2" value-ref="dept2"/>
</map>
</property>
</bean>
-
用util规范
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="love1" class="com.baor.pojo.Love">
<property name="loveName" value="吃屎"/>
</bean>
<bean id="love2" class="com.baor.pojo.Love">
<property name="loveName" value="喝尿"/>
</bean>
<bean id="love3" class="com.baor.pojo.Love">
<property name="loveName" value="打飞机"/>
</bean>
<bean id="dept1" class="com.baor.pojo.Dept">
<property name="DId" value="101"/>
<property name="DName" value="技术部"/>
</bean>
<bean id="dept2" class="com.baor.pojo.Dept">
<property name="DId" value="102"/>
<property name="DName" value="测试部"/>
</bean>
<util:list id="loveList">
<ref bean="love1"/>
<ref bean="love2"/>
<ref bean="love3"/>
</util:list>
<util:map id="deptMap">
<entry key="101" value-ref="dept1"></entry>
<entry key="102" value-ref="dept2"/>
</util:map>
<bean id="emp" class="com.baor.pojo.Emp">
<property name="ename" value="杨艺群"/>
<property name="eage" value="23"/>
<property name="loves" ref="loveList"/>
<property name="deptMap" ref="deptMap"/>
</bean>
</beans>
要改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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
-
p命名空间注入
<?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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="love1" class="com.baor.pojo.Love">
<property name="loveName" value="吃屎"/>
</bean>
<bean id="love2" class="com.baor.pojo.Love">
<property name="loveName" value="喝尿"/>
</bean>
<bean id="love3" class="com.baor.pojo.Love">
<property name="loveName" value="打飞机"/>
</bean>
<bean id="dept1" class="com.baor.pojo.Dept">
<property name="DId" value="101"/>
<property name="DName" value="技术部"/>
</bean>
<bean id="dept2" class="com.baor.pojo.Dept">
<property name="DId" value="102"/>
<property name="DName" value="测试部"/>
</bean>
<util:list id="loveList">
<ref bean="love1"/>
<ref bean="love2"/>
<ref bean="love3"/>
</util:list>
<util:map id="deptMap">
<entry key="101" value-ref="dept1"></entry>
<entry key="102" value-ref="dept2"/>
</util:map>
<bean id="emp" class="com.baor.pojo.Emp" p:ename="杨艺群" p:eage="12" p:loves-ref="loveList" p:deptMap-ref="deptMap"></bean>
</beans>
-
p命名空间
<?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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="love1" class="com.baor.pojo.Love">
<property name="loveName" value="吃屎"/>
</bean>
<bean id="love2" class="com.baor.pojo.Love">
<property name="loveName" value="喝尿"/>
</bean>
<bean id="love3" class="com.baor.pojo.Love">
<property name="loveName" value="打飞机"/>
</bean>
<bean id="dept1" class="com.baor.pojo.Dept">
<property name="DId" value="101"/>
<property name="DName" value="技术部"/>
</bean>
<bean id="dept2" class="com.baor.pojo.Dept">
<property name="DId" value="102"/>
<property name="DName" value="测试部"/>
</bean>
<util:list id="loveList">
<ref bean="love1"/>
<ref bean="love2"/>
<ref bean="love3"/>
</util:list>
<util:map id="deptMap">
<entry key="101" value-ref="dept1"></entry>
<entry key="102" value-ref="dept2"/>
</util:map>
<bean id="emp" class="com.baor.pojo.Emp" p:ename="杨艺群" p:eage="12" p:loves-ref="loveList" p:deptMap-ref="deptMap"></bean>
</beans>
引入外部属性文件
-
引入数据库相关依赖
mysql-connector-java
druid
2. 创建外部属性文件,properties格式,定义数据信息、
jdbc.url = jdbc:mysql://localhost:3306/tieba?useSSL=false&serverTimeZone=UTC&characterEncoding=utf-8
jdbc.userName = root
jdbc.password = 123456
jdbc.driver = com.mysql.cj.jdbc.Driver
3. 创建spring配置文件,引入context命名空间,引入属性文件,使用表达式完成注入
xmls:context="http://www.springframework.org/schema/context"
xsi:schemaLocation = "http://www/springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"d
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

被折叠的 条评论
为什么被折叠?



