开发者社区> 西北野狼> 正文

Spring -- IOC

简介: Spring Expression Language Spring Expression Language,Spring表达式语言,简称SpEL。支持运行时查询并可以操作对象图。 和JSP页面上的EL表达式、Struts2中用到的OGNL表达式一样,SpEL根据JavaBean风格的getXxx()、setXxx()方法定义的属性访问对象图,完全符合我们熟悉的操作习惯。
+关注继续查看

Spring Expression Language

Spring Expression Language,Spring表达式语言,简称SpEL。支持运行时查询并可以操作对象图。

和JSP页面上的EL表达式、Struts2中用到的OGNL表达式一样,SpEL根据JavaBean风格的getXxx()setXxx()方法定义的属性访问对象图,完全符合我们熟悉的操作习惯

SpEL使用#{}作为定界符,所有在大框号中的字符都将被认为是SpEL表达式。

  整数:<property name="count" value="#{5}"/>

  小数:<property name="frequency" value="#{89.7}"/>

  科学计数法:<property name="capacity" value="#{1e4}"/>

  String类型的字面量可以使用单引号或者双引号作为字符串的定界符号

    <property name=“name” value="#{'Chuck'}"/>

    <property name='name' value='#{"Chuck"}'/>

  Boolean:<property name="enabled" value="#{false}"/>

 引用其他bean

<bean id="emp04" class="com.soyoungboy.parent.bean.Employee">
    <property name="empId" value="1003"/>
    <property name="empName" value="Kate"/>
    <property name="age" value="21"/>
    <property name="detp" value="#{dept}"/>
</bean>

 

  引用其他bean的属性值作为自己某个属性的值:

<bean id="emp05" class="com.soyoungboy.parent.bean.Employee">
    <property name="empId" value="1003"/>
    <property name="empName" value="Kate"/>
    <property name="age" value="21"/>
    <property name="deptName" value="#{dept.deptName}"/>
</bean>

调用静态方法

<bean id="person6" class="com.soyoungboy.bean.Person">
        <property name="firstName" value="#{person05.firstName}"></property>
        <property name="age" value="#{18*88}"></property>
        <property name="lastName"
            value="#{T(java.util.UUID).randomUUID().toString().substring(0,5)}}"></property>

    </bean>

调用非静态方法

<!-- 创建一个对象,在SpEL表达式中调用这个对象的方法 -->
<bean id="salaryGenerator" class="com.soyoungboy.spel.bean.SalaryGenerator"/>

<bean id="employee" class="com.soyoungboy.spel.bean.Employee">
    <!-- 通过对象方法的返回值为属性赋值 -->
    <property name="salayOfYear" value="#{salaryGenerator.getSalaryOfYear(5000)}"/>
</bean>

 

使用注解标识组件

①普通组件:@Component

标识一个受Spring IOC容器管理的组件

②持久化层组件:@Respository

标识一个受Spring IOC容器管理的持久化层组件

③业务逻辑层组件:@Service

标识一个受Spring IOC容器管理的业务逻辑层组件

④表述层控制器组件:@Controller

标识一个受Spring IOC容器管理的表述层控制器组件

⑤组件命名规则

[1]默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id

[2]使用组件注解的value属性指定bean的id

 

注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以@Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。

扫描组件:

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

[1]base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。
[2]当需要扫描多个包时可以使用逗号分隔。
[3]如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:

<context:component-scan 
    base-package="com.soyoungboy.component" 
    resource-pattern="autowire/*.class"/>

包含与排除

<context:include-filter>子节点表示要包含的目标类

注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。即:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则指定的组件了。

<context:exclude-filter>子节点表示要排除在外的目标类

component-scan下可以拥有若干个include-filter和exclude-filter子节点

JAR包

必须在原有JAR包组合的基础上再导入一个:spring-aop-4.0.0.RELEASE.jar

组件装配

Controller组件中往往需要用到Service组件的实例,Service组件中往往需要用到Repository组件的实例。Spring可以通过注解的方式帮我们实现属性的装配。

                  ②实现依据在指定要扫描的包时,<context:component-scan> 元素会自动注册一个bean的后置处理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记了@Autowired、@Resource或@Inject注解的属性。

                  ③@Autowired注解

                          [1]根据类型实现自动装配。

        [2]构造器、普通字段(即使是非public)、一切具有参数的方法都可以应用@Autowired注解

        [3]默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。

        [4]若某一属性允许不被设置,可以设置@Autowired注解的required属性为 false

        [5]默认情况下,当IOC容器里存在多个类型兼容的bean时,Spring会尝试匹配bean的id值是否与变量名相同,如果相同则进行装配。如果bean的id值不相同,通过类型的自动装配将无法工作。此时可以在@Qualifier注解里提供bean的名称。Spring甚至允许在方法的形参上标注@Qualifiter注解以指定注入bean的名称。

       [6]@Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行自动装配。

       [7]@Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。

       [8]@Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。

  ④@Resource

    @Resource注解要求提供一个bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为bean的名称。

  ⑤@Inject

    @Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。

 泛型依赖注入

public class BaseDao<T> {
    
    public void daoSave(){
        System.out.println("保存...");
    }

}
public class BookDao extends BaseDao<Book>{
    
    public void save(){
        System.out.println("bookDao...save....");
        daoSave();
    }

}
public class BaseService<T> {
    @Autowired
    BaseDao<T> baseDao;
}
@Service
public class BookService extends BaseService<Book>{
    
    public void save(){
        System.out.println("BookService...保存:"+baseDao);
    }
}
public class Book {

}

配置文件:

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

测试代码:

public class IOCTest {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");

    @Test
    public void test() {
        BookService bookService = ioc.getBean(BookService.class);
        System.out.println("====================");
        bookService.save();
    }

}

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring IOC容器的依赖注入流程(收集和注册、分析和组装)
Spring IOC容器的依赖注入工作可以分为两个阶段
30 0
spring的IOC详解
spring的IOC详解
23 0
Spring核心机制IOC和AOP
将对象的创建进行反转,由Spring框架为我们创建对象
22 0
Spring 框架(Spring Framework)概述及 IOC(控制反转)详解
Spring 框架(Spring Framework)概述及 IOC(控制反转)详解
45 0
(2)Spring之IOC面试核心知识点
Spring之IOC面试核心知识点
28 0
(一)Spring工厂的底层实现原理(简易版)&理解Spring三大核心思想之一:IOC思想及使用
Spring工厂的底层实现原理(简易版)&理解Spring三大核心思想之一:IOC思想及使用 🍅 作者:程序员小王 🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:https://blog.csdn.net/weixin_44385486/article/details/121241079
119 0
《Spring IOC核心技术》共27章,19万字,打包发布!!
大家好,我是冰河~~ 之前很多小伙伴跟我说:网上关于Spring IOC的技术不是很系统,也不是很全面,问我如何系统的学习Spring IOC技术,于是乎,我趁着2023年春节假期系统性的整理了这本《Spring IOC核心技术》电子书。 这也是2023年春节后,发布的第一本电子书,希望这本《Spring IOC核心技术》能够为大家带来实质性的帮助。 小伙伴们可以先拉到文末直接查看获取电子书的方式,然后再回来听我唠叨。
26 0
Java学习路线-56:Spring与Ioc
Java学习路线-56:Spring与Ioc
18 0
Spring容器 IoC思想 DI实现
Spring容器 IoC思想 DI实现
57 0
+关注
西北野狼
擅长Android ,J2EE开发 博客园地址:http://www.cnblogs.com/androidsuperman/p/7834762.html github地址: https://github.com/soyoungboy
文章
问答
文章排行榜
最热
最新
相关电子书
更多
电商网站需求分析和架构设计Spring Boot2.6入门
立即下载
云上Docker的Spring Cloud微服务应用实践分享
立即下载
Spring Boot 2.6.0电商网站开发实战
立即下载