IOC——Spring的bean的管理(xml配置文件)
Bean实例化(三种方式)
1、使用类的无参构造进行创建(大多数情况下)
<bean id="user" class="com.bjxb.ioc.User"></bean>
(1)上面的代码使用的就是默认的无参构造的方式进行Bean的实例化
(2)使用这种方法我们需要注意,如果类中没有无参构造,会出现异常
2、使用静态工厂创建
(1)创建静态的方法,返回类的对象,以User对象为例
public class UserFactory {
// 静态方法,返回User对象
public static User getUser() {
return new User();
}
}
(2)配置文件中使用静态工厂创建对象
<bean id="user" class="com.bjxb.ioc.UserFactory" factory-method="getUser"></bean>
3、使用实例工厂创建
(1)创建普通方法,返回类的对象,以User对象为例
public class UserFactory {
// 普通方法,返回User对象
public User getUser() {
return new User();
}
}
(2)配置文件中使用实例工厂创建对象
<!-- 创建工厂对象 -->
<bean id="userFactory" class="com.bjxb.ioc.UserFactory"></bean>
<!-- 配置Bean对象 -->
<bean id="user" class="com.bjxb.ioc.User" factory-bean="userFactory" factory-method="getUser"></bean>
Bean标签的常用属性
1、id属性
给当前bean起名称,不能包含特殊符号,我们可以根据id值得到配置对象.
2、class属性
给当前bean指定对象所在类的全路径.
3、name属性
给当前bean起名称(与id属性类似),但是id属性值不能包含特殊符号,而在name属性值里面可以包含特殊符号。在Struts1框架中,action起名可以写符号(比如加上#),为了整合Struts1,解决遗留问题,扩展了name属性值。
4、scope属性
scope属性可以指定Bean的作用范围
(1)singleton:默认值,单例,对象只创建一次。
(2)prototype:多例的。每次使用都会创建一个新的对象。
(3)request:WEB项目中,Spring创建一个Bean的对象,将对象存到request域中。
(4)session:WEB项目中,Spring创建一个Bean的对象,将对象存到session域中。
(5)globalSession:WEB项目中,应用在Prolet环境,如果没有Prolet环境,那么globalSession相当于session。
Bean的属性注入
1、创建对象的时候,类中的属性被设置了默认值,称为bean的属性注入
2、属性注入的三种方式(Spring只支持前两种,用的最多的是第一种——set方法注入):
(1)Setter注入:使用属性的set方法进行注入。
public class TestUser {
private String name;
public void setName(String name) {
this.name=name;
}
}
public static void main(String[] args) {
TestUser user = new TestUser();
user.setName("花咖");
}
(2)构造器注入:使用有参数的构造器进行注入。
public class TestUser {
private String name;
public TestUser(String name) {
this.name = name;
}
}
public static void main(String[] args) {
TestUser user = new TestUser("花咖");
}
(3)接口注入:让类继承带有方法的接口,在实现类继承的方法中,进行属性注入。
public interface UserDao {
void InjectTest(String name);
}
public class TestUser implements UserDao{
private String name;
@Override
public void InjectTest(String name) {
// TODO Auto-generated method stub
this.name=name;
}
}
3、Spring中Bean的属性注入如何运用
(1)Set方法注入
实体类:
public class PropertyDemo1 {
private String bookname;
// set方法
public void setBookname(String bookname) {
this.bookname = bookname;
}
}
配置类中代码(默认是applicationContext.xml):
<!-- 使用set方法注入属性 -->
<bean id="demo1" class="com.bjxb.ioc.PropertyDemo1">
<!-- 注入属性值
name属性,类里面定义的属性名称
value属性,设置具体的值
-->
<property name="bookname" value="大话设计模式"></property>
</bean>
(2)有参构造方式注入
实体类:
public class PropertyDemo2 {
private String uname;
public PropertyDemo2(String uname) {
this.uname = uname;
}
}
配置类中代码(默认是applicationContext.xml):
<beans>
<!-- 使用有参数构造注入属性 -->
<bean id="demo2" class="com.bjxb.ioc.PropertyDemo2">
<!-- 使用有参构造注入 -->
<constructor-arg name="uname" value="花咖"></constructor-arg>
</bean>
</beans>
4、重点——注入对象类型的属性
(1)service 中 注入 dao 层的类
UserDao:
public class UserDao {
public void add() {
System.out.println("dao.add........");
}
}
UserService:
public class UserService {
// 1.定义dao类型属性
public UserDao dao;
// 2.生成set方法
public void setDao(UserDao dao) {
this.dao = dao;
}
public void add() {
System.out.println("service.add.......");
dao.add();
}
}
配置类中代码(默认是applicationContext.xml):
<!-- 注入对象类型的属性 -->
<!-- 配置service和dao对象 -->
<bean id="userDao" class="com.bjxb.ioc.UserDao"></bean>
<bean id="userService" class="com.bjxb.ioc.UserService">
<!-- 注入dao对象
name属性值:service类里面的属性名称
现在不要写value属性,因为刚才是字符串,现在是对象
写ref属性,配置dao的bean标签中的id值
-->
<property name="dao" ref="userDao"></property>
</bean>
5、使用P命名空间进行属性注入(对于Setter注入的简化)
(1)首先在beans标签中加入如下属性(复制上一行的beans命名空间):

(2)然后我们在注入属性时使用 P 命名空间的方式:
实体类:
public class Person {
private String pname;
public void setPname(String pname) {
this.pname=pname;
}
}
配置类中代码(默认是applicationContext.xml):
<!-- p名称空间注入 -->
<bean id="person" class="com.bjxb.propertyTest.Person" p:pname="花咖"></bean>
6、注入复杂类型属性
(1)数组
(2)list 集合
(3)map 集合
(4)properties 类型
实体类:
public class Person {
private String[] arrs;
private List<String> list;
private Map<String, String> map;
private Properties properties;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
配置类中代码(默认是applicationContext.xml):
<!-- 注入复杂类型的属性值 -->
<bean id="person" class="com.bjxb.propertyTest.Person">
<!-- 数组 -->
<property name="arrs">
<array>
<value>小红</value>
<value>小黄</value>
<value>小蓝</value>
</array>
</property> <!-- list -->
<property name="list">
<list>
<value>小白</value>
<value>小黑</value>
<value>小太</value>
</list>
</property> <!-- map -->
<property name="map">
<map>
<entry key="aa" value="Lucy"></entry>
<entry key="bb" value="Jerry"></entry>
<entry key="cc" value="Tom"></entry>
</map>
</property> <!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
IOC——Spring的bean的管理(xml配置文件)的更多相关文章
- IOC——Spring的bean的管理(注解方式)
注解(简单解释) 1.代码里面特殊标记,使用注解可以完成一定的功能 2.注解写法 @注解名称(属性名称=属性值) 3.注解使用在类上面,方法上面和属性上面 注意:注解方式不能完全替代配置文件方式 Sp ...
- spring对bean的管理细节
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Spring中bean的管理
Spring 中常见的容器 我们知道spring容器就是spring中bean的驻留场所.spring容器并不是只有一个.spring自带了多个容器实现,可以归为两种不同的类型:bean工厂和应用上下 ...
- Spring之Bean的管理方式(Content,Beans)
Spring的bean管理(注释) 注解 代码里特殊的标记,使用注解也可以直接完成相关功能 注解写法:@注解名称(属性名=属性值) 使用在类,方法,属性上面 Spring注解开发准备 导入jar包 ( ...
- 03 Spring对Bean的管理
Spring创建bean的三种方式 1.第一种方式:使用默认构造函数创建 bean.xml <?xml version="1.0" encoding="UTF-8& ...
- 【Spring】28、Spring中基于Java的配置@Configuration和@Bean用法.代替xml配置文件
Spring中为了减少xml中配置,可以生命一个配置类(例如SpringConfig)来对bean进行配置. 一.首先,需要xml中进行少量的配置来启动Java配置: <?xml version ...
- 【Spring】JDBC事务管理XML配置
将spring事务管理与spirng-mybatis分离开了: <?xml version="1.0" encoding="UTF-8"?> < ...
- Spring中Bean的管理问题
首先,配置文件中定义的bean并不是都在启动时实例化. <bean id="accountService" class="com.foo.DefaultAccoun ...
- Spring怎么引入多个xml配置文件
方式一:在web.xml中通过<context-param> 标签引入 <context-param> <param-name>contextConfigLocat ...
随机推荐
- Winfrom中关于toolStrip工具栏中按钮背景的设置
在ToolStrip中可以存放很多种控件,一般来说,主要使用的是Button和DropDownButton,通常情况下,Button需要设置图片和文字,网上找了很多个方法都不太靠谱,自己试验了下,下面 ...
- ORACLE SQL*PLUS 命令大全
转至:https://www.cnblogs.com/kerrycode/archive/2011/06/09/2076248.html 其实网上已经有SQL*PLUS命令大全这方面的资料了,不过大都 ...
- MySQL 学习笔记(一)MySQL 事务的ACID特性
MySQL事务是什么,它就是一组数据库的操作,是访问数据库的程序单元,事务中可能包含一个或者多个 SQL 语句.这些SQL 语句要么都执行.要么都不执行.我们知道,在MySQL 中,有不同的存储引擎, ...
- c/c++ 常见字符串处理函数总结 strlen/sizeof strcpy/memcpy/strncpy strcat/strncat strcmp/strncmp sprintf/sscanf strtok/split/getline atoi/atof/atol
这里总结工作中经常用到的一些c/c++的字符串处理方法,标黑的是使用频率较高的 1.strlen函数:计算目标字符串长度, 格式:strlen(字符指针指向区域) 注意1:①不包含字符串结束 ...
- 系统整理qt笔记3
qtcreator中不能输入中文: https://blog.csdn.net/qq_15725099/article/details/97305507 main.cpp #include " ...
- selenium+python自动化-元素定位
自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告. 本篇主要讲几种基本的元素定位方法元素定位在这四个环节中是至关重要的,如果说按学习精力 ...
- 在矩池云上复现 PaddleGAN 照片转油画风格教程
我选用的是cuda10.1纯镜像 案例来自paddlepaddle官方PaddleGAN库中,可以查看 https://github.com/PaddlePaddle/PaddleGAN/ https ...
- MySQL中使用IN会不会走索引
结论:IN肯定会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描 navicat可视化工具使用explain函数查看sql执行信息 场景1:当IN中的取值只有一个主键时 我们只需要注意一个 ...
- 『现学现忘』Docker常用命令 — 20、容器常用命令(二)
提示:接上一篇 目录 9.后台启动容器 10.查看容器日志 11.查看容器内运行的进程 12.查看容器内部细节 9.后台启动容器 后台启动容器也叫启动守护式容器. 命令:docker run -d 镜 ...
- tensorflow编译成功!
使用bazel编译tensorflow项目的core包成功!找了个简单的target可视化,留作纪念,命令如下: bazel query --noimplicit_deps --nohost_deps ...