Java学习路线-56:Spring与Ioc(2)

简介: Java学习路线-56:Spring与Ioc



3、工厂方法创建


(1)静态工厂


package com.pengshiyu.factory;
import com.pengshiyu.bean.Person;
public class PersonFactory {
    public static Person newInstance(String name) {
        return new Person(name);
    }
}
<beans >
    <bean name="person" class="com.pengshiyu.factory.PersonFactory" factory-method="newInstance">
        <constructor-arg name="name" value="Tom" />
    </bean>
</beans>


(2)动态工厂


package com.pengshiyu.factory;
import com.pengshiyu.bean.Person;
public class PersonFactory {
    public Person newInstance(String name) {
        return new Person(name);
    }
}
<beans>
    <bean id="factory" class="com.pengshiyu.factory.PersonFactory" />
    <bean name="person" factory-bean="factory" factory-method="newInstance">
        <constructor-arg name="name" value="Tom"/>
    </bean>
</beans>


意静态工厂 static


四、Spring 配置文件

id 是 bean 的唯一标识符,如果没有配置 id,name 默认为标识符


如果配置了 id,又配置了 name,则 name 是别名

name 可以设置多个别名分隔符可以是空格、逗号、分号


class 是 bean 的全限定名=包名+类名

如果不配置 id 和 name,那么可以可以使用如下方式获取对象

applicationContext.getBean(class)



配置如下


 

Person person = (Person) context.getBean("person1");
// 或者
Person person = (Person) context.getBean("user");
// 或者
Person person = (Person) context.getBean(Person.class);


获取方式


Person person = (Person) context.getBean("person1");
// 或者
Person person = (Person) context.getBean("user");
// 或者
Person person = (Person) context.getBean(Person.class);



导入文件


 

<beans>
    <import resource="person.xml"/>
</beans>



五、Spring 依赖注入 DI

dependency injection

依赖:指 bean 对象创建依赖于容器,bean 对象的依赖资源


注入:指 bean 对象依赖的资源由容器来设置和装配


spring 注入


测试


package com.spring.test;
import com.pengshiyu.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Person person = (Person) context.getBean("person");
        person.sayHello();
    }
}




构造器注入

package com.pengshiyu.bean;
public class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
    public void sayHello() {
        System.out.println("hello " + this.name);
    }
}


<beans>
    <bean name="person" class="com.pengshiyu.bean.Person">
        <constructor-arg name="name" value="Tom"/>
    </bean>
</beans>

 

     

 

1

2

3

4

5

setter 注入

(1)常量注入


package com.pengshiyu.bean;
public class Person {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public void sayHello() {
        System.out.println("hello " + this.name);
    }
}


<beans >
    <bean name="person" class="com.pengshiyu.bean.Person">
        <property name="name" value="Tom"/>
    </bean>
</beans>


(2)bean 注入


package com.pengshiyu.bean;
public class Address {
    private String address;
    public void setAddress(String address) {
        this.address = address;
    }
    public String getAddress() {
        return address;
    }
}



package com.pengshiyu.bean;
public class Person {
    private String name;
    private Address address;
    public void setAddress(Address address) {
        this.address = address;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void sayHello() {
        System.out.println("hello " + this.name + this.address.getAddress());
    }
}
package com.pengshiyu.bean;
public class Person {
    private String name;
    private Address address;
    public void setAddress(Address address) {
        this.address = address;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void sayHello() {
        System.out.println("hello " + this.name + this.address.getAddress());
    }
}



(3)数组注入


package com.pengshiyu.bean;
public class Book {
    private  String name;
    public Book(String name){
        this.name = name;
    }
    @Override
    public String toString() {
        return "《" + this.name + "》";
    }
}


package com.pengshiyu.bean;
import java.util.Arrays;
public class Person {
    private Book[] books;
    public void setBooks(Book[] books) {
        this.books = books;
    }
    @Override
    public String toString() {
        return "Person{" +
                "books=" + Arrays.toString(books) +
                '}';
    }
}
<beans >
    <bean name="person" class="com.pengshiyu.bean.Person">
        <property name="books">
            <array>
                <value>水浒传</value>
                <value>红楼梦</value>
                <value>三国演义</value>
                <value>西游记</value>
            </array>
        </property>
    </bean>
</beans>


(4)List 注入


package com.pengshiyu.bean;
import java.util.Arrays;
import java.util.List;
public class Person {
    private List[] books;
    public void setBooks(List[] books) {
        this.books = books;
    }
    @Override
    public String toString() {
        return "Person{" +
                "books=" + Arrays.toString(books) +
                '}';
    }
}
<beans>
    <bean name="person" class="com.pengshiyu.bean.Person">
        <property name="books">
            <list>
                <value>水浒传</value>
                <value>红楼梦</value>
                <value>三国演义</value>
                <value>西游记</value>
            </list>
        </property>
    </bean>
</beans>

(5)Map 注入


package com.pengshiyu.bean;
import java.util.Map;
public class Person {
    private Map cards;
    public void setCards(Map cards) {
        this.cards = cards;
    }
    @Override
    public String toString() {
        return cards.toString();
    }
}
<beans>
    <bean name="person" class="com.pengshiyu.bean.Person">
        <property name="cards">
            <map>
                <entry key="中国银行" value="123456"></entry>
                <entry key="建设银行" value="123456"></entry>
            </map>
        </property>
    </bean>
</beans>


(6)Set 注入


package com.pengshiyu.bean;
import java.util.Set;
public class Person {
    private Set games;
    public void setGames(Set games) {
        this.games = games;
    }
    @Override
    public String toString() {
        return games.toString();
    }
}
<beans>
    <bean name="person" class="com.pengshiyu.bean.Person">
        <property name="games">
            <set>
                <value>英雄联盟</value>
                <value>王者荣耀</value>
            </set>
        </property>
    </bean>
</beans>


(7)null 注入


package com.pengshiyu.bean;
public class Person {
    public void setWife(String wife) {
        this.wife = wife;
    }
    private String wife;
    @Override
    public String toString() {
        return wife;
    }
}


<beans>
    <bean name="person" class="com.pengshiyu.bean.Person">
        <property name="wife"><null/></property>
    </bean>
</beans>

(8) Properties 注入


package com.pengshiyu.bean;
import java.util.Properties;
public class Person {
    private Properties props;
    public void setProps(Properties props) {
        this.props = props;
    }
    @Override
    public String toString() {
        return this.props.toString();
    }
}


<beans >
    <bean name="person" class="com.pengshiyu.bean.Person">
        <property name="props">
            <props>
                <prop key="name">Tom</prop>
                <prop key="sex">Man</prop>
            </props>
        </property>
    </bean>
</beans>

(9) p 命名空间注入

需要有对应的 set 方法


package com.pengshiyu.bean;
public class Person {
    private String name;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

头文件需要引入


xmlns:p="http://www.springframework.org/schema/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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="person" class="com.pengshiyu.bean.Person"
          p:name="Tom" p:age="23"/>
</beans>

(10)c 命名空间注入

要求有对应的构造方法


package com.pengshiyu.bean;
public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

头文件需要引入


xmlns:c="http://www.springframework.org/schema/c"
<?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:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="person" class="com.pengshiyu.bean.Person"
          c:name="Tom" c:age="23"/>
</beans>

六、bean 的作用域

spring


桥梁

轻量级

易学

ioc di

app

事务

整合框架

scope:


singleton 单例 整个容器只有一个对象实例(默认)

prototype 原型 每次获取 Bean 都产生一个新对象

request 每次请求时创建一个新的对象

session 会话范围内有一个对象

global session 只在 portlet 下有用,表示 applicatio

application 在应用范围中有一个对象

Bean 自动装配

autowire


byName

byType

constructor

不推荐使用自动装配


相关文章
|
26天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
65 2
|
13天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
30 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
10天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
28 2
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
2月前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
1月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
2月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
95 2
|
24天前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
42 0
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0
|
Java 数据库连接 Maven
Java学习路线-66:Maven
Java学习路线-66:Maven
116 0