博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.spring:自动装配/Bean之间的关系/作用域/外部文件/spel/
阅读量:7243 次
发布时间:2019-06-29

本文共 3312 字,大约阅读时间需要 11 分钟。

1.自动装配/手动装配

xml配置文件里的bean自动装配

Spring IOC 容器里可以自动的装配Bean,需要做的仅仅是在<bean>的autowire属性里面指定自动装配模式
->byType(根据类型自动进行装配):若IOC容器里需要有多个与目标Bean类型一样的Bean,在这种情况子下,Spring无法判定那个Bean合适,所以不能执行自动装配
->byName(根据名称自动装配):必须将目标Bean的名称和属性名设置完全相同,
->constuuctor(通过是构造器自动装配):当bean中存在多个构造器时,这个方法将会复杂,不建议使用
一般情况下很少进行使用这个属性

 Car.java

public class Car {    private String brand;    private int price;   //... }

 Person .java

public class Person {    private String name;    private Address address;    private Car car;   //... }

 Address .java

public class Address {    private String city;    private String street;   //... }

applicationContext.xml

测试:

Person p = (Person) ctx.getBean("person");System.out.println(p);
Person [name=MrChengs, address=Address [city=BeiJing, street=sanqing_Street],  car=Car [brand=BMW, price=10000]]

 

2.Bean之间的关系

继承:

Spring允许继承bean之间的配置,被继承的bean称为父类bean,继承这个父bean的bean称为字bean

子bean从父类中继承配置,包括父类的属性配置
子bean也可以覆盖从父类继承过来的配置
父类可以作为模板,也可以作为bean实例,若相把父类的作为模板,可以设置父类bean的abstract属性为true,这样spring将不会实例化这个Bean
并不是bean元素里的属性都会被继承,比如autowire,abstract等
也可以忽略父bean的class属性,让子类指定子的类,面向共享的配置,但是此时abstract必须设为true

1、父bean是一个实例时。它本身是一个完整的bean

2、父bean是模板,抽象bean,不能被实例化,只是来被继承。

父bean一定不能实例化,因为它没有class属性,实例化会跑异常。那就一定要写abstract属性,让spring不实例化它。

当遇到一个类要实例化出很多相似的bean对象时,看起来是不是很不简洁。

applicationContext.xml

Address address1 = (Address) ctx.getBean("address1");

 

依赖:

Spring允许用户通过depend-on属性设置bean前置依赖关系,前置以来的bean会在本bean实例化之前创建好

如果依赖多个bean,则可以使用逗号,空格或的方式配置bean的名称

我们需要让某个属性必须存在,就像必填项一样。 用depends-on 依赖

这样,依赖存在了,就可以正常实例化了

 

3.bean的作用域

作用域:

singleton:单例,整个应用中只创建一个实例(默认)

prototype:原型,每次注入时都新建一个实例

session:会话,每个会话创建一个实例,在一个session会话中,是同一个bean,不同session就是不同bean

request:请求,每个请求创建一个实例,每一个HTTP请求生成一个新的bean

 

applicationContext.xml

测试:

Car car = (Car) ctx.getBean("car");        Car car2 = (Car) ctx.getBean("car");        System.out.println(car ==car2);
true
scope="prototype"则为false

 

4.使用外部文件

propertie.properties

user=rootpassword=1234driverClass=com.mysql.jdbc.DriverjdbcUrl=jdbc\:mysql\://localhost\:3307/shijian

applicationContext.xml

DataSource dataSource = (DataSource) ctx.getBean("dataSource",DataSource.class);            System.out.println("执行中");            System.out.println(dataSource.getConnection());            System.out.println("结束");

${},代表引用外部的变量

 通过把配置信息独立到一个文件里面,bean用${}方式引用, 便于维护、更清晰

如果响应修改只需要修改配置文件即可!

 

5.SpEl

SpEL---Spring Expression Language:

是一个支持运行时查询和操作对象图表达式语言、使用#{...}作为定界符,为bean属性动态赋值提供了便利。

1) 为属性赋值字面值

Address address= (Address) ctx.getBean("address");        System.out.println(address);
Address [city=beijing, street=Shangye]

2)引用 类的静态属性,用T()调用一个类的静态方法,它将返回一个Class Object,然后再调用相应的方法或属性

Car car = (Car) ctx.getBean("car");        System.out.println(car);
Car [brand=Aodi, price=12345.0, circle=251.32741228718345]

3)其他

Person p = (Person) ctx.getBean("person");        System.out.println(p);
Person [name=MrChengs, car=Car [brand=Aodi, price=12345.0, circle=251.32741228718345], city=beijing, info=有钱]

等待还有很多其他的....

 

转载于:https://www.cnblogs.com/Mrchengs/p/10086337.html

你可能感兴趣的文章
域计算机修改修改本地帐号密码
查看>>
负载均衡集群的实现方式之一LVS
查看>>
公有云产品试用介绍
查看>>
我的友情链接
查看>>
Servlet+JSP+MySQL实现用户管理模块之六、实现用户信息显示
查看>>
软件项目管理
查看>>
3012.脚本作业—l201.10.0编写一个脚本用于检测IP地址(递进版10)
查看>>
rpmbuild SPEC文件
查看>>
心在山水间
查看>>
ionic开发android app步骤
查看>>
【数据结构】位图BitMap与布隆过滤器BloomFilter
查看>>
mysql主从 主主
查看>>
Java中FileInputStream和FileOutputStream类实现文件夹及文件的复制粘贴
查看>>
tomcat+jdk部署
查看>>
Toast源码深度分析
查看>>
zabbix监控公网机器
查看>>
python requests模块详解
查看>>
PHP应用架构演化
查看>>
Python定义全局变量的用法
查看>>
RESTful API使用详解
查看>>