80.【Spring5】(二)

简介: 80.【Spring5】

2.使用有参构造函数创建对象(不存在无参)

实体类

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
public class User {
    private String name;
    public void show(){
        System.out.println("name="+name);
    }
}

(1). 使用下标进行创建对象

index----> 有参构造函数的,属性从左向右排序

<bean id="user" class="Com.Jsxs.pojo.User">
<!--     下标赋值        -->
            <constructor-arg index="0" value="吉士先生"/>
        </bean>
(2).使用类型进行创建对象

type: 指的是参数的类型,如果不是基本数据类型,那么需要使用权限定名

<bean id="user" class="Com.Jsxs.pojo.User">
<!--    类型赋值     类型必须是全限定名   -->
        <constructor-arg type="java.lang.String" value="吉士先生"/>
    </bean>
(3).使用属性名进行创建对象

name: 指的是赋值属性的属性名叫什么

<!--    直接通过参数名进行赋值-->
    <bean id="user" class="Com.Jsxs.pojo.User">
        <constructor-arg name="name" value="吉士先生"/>
    </bean>

3. 使用有参和无参构造都存在的时候

有参和无参的方法都可以用,可以同时存在,不冲突;

4.总结

在配置文件的时候,容器中已经管理的对象就已经初始化了。

(五)、Spring 配置说明

1.alias(区分大小写)

大名和小名都可以指定

<alias name="需要修改的名字" alias="修改成什么"/>

实体类

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    public void show(){
        System.out.println("name="+name);
    }
}

配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="Com.Jsxs.pojo.User">
        <property name="name" value="小明"/>
    </bean>
    <alias name="user" alias="us"/>
</beans>

测试

import Com.Jsxs.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) context.getBean("us");
        user.show();
    }
}

2.bean(一个实体类一个bean)

  • id: 变量名
  • class : 类的全限定名
  • name: 可以起别名(不限制一个)
<bean id="user" class="Com.Jsxs.pojo.User" name="us,se" >
        <property name="name" value="小明"/>
    </bean>

3.import

一般用于团队的开发,它可以将多个配置文件,导入合并为一个。

不同的开发人员,有不同的beans,最后合并到一个applicationContext;

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <import resource="beans.xml"/>
</beans>

在合并的时候,如果出现了同名且值i一样,那么就会产生覆盖。否则不会覆盖。

4.ref

意思就是:在实体类Address类中 new 一个对象叫做address2,
然后把new出来的address2赋值给实体类Student中属性名叫做address的。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="address2" class="Com.Jsxs.pojo.Address"/>
        <bean id="student" class="Com.Jsxs.pojo.Student">
<!--    第二种: Bean注入 ref-->
            <property name="address" ref="address2"/>
        </bean>
</beans>

(六)、依赖注入

1.构造器注入

章节四就是构造器注入(有参构造就是,无参不是)

2.Set方式注入【重点】

  • 依赖注入: Set注入
  • 依赖: bean对象创建依赖于容器
  • 注入:bean对象中的所有属性,由容器来注入。
(1).环境搭建

复杂类型

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
    private String address;
}

真实测试对象

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {
    private String name;
    private Address address;  //类对象
    private String[] books;  //数组
    private List<String> hobbys;  // list集合
    private Map<String,String> card;  //键值
    private Set<String> games;  //set集合
    private String wife;    //null
    private Properties info;  //配置
}

配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="student" class="Com.Jsxs.pojo.Student">
<!--    普通的set 方法注入        -->
            <property name="name" value="吉士先生"/>
        </bean>
</beans>

测试

import Com.Jsxs.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student.getName());
    }
}
(2).开始真正实现

完善注入信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="address2" class="Com.Jsxs.pojo.Address"/>
        <bean id="student" class="Com.Jsxs.pojo.Student">
<!--    第一种:普通注入  value-->
            <property name="name" value="吉士先生"/>
<!--    第二种: Bean注入 ref-->
            <property name="address" ref="address2"/>
<!--    第三种: 数组注入 -->
            <property name="books">
                <array>
                    <value>红楼梦</value>
                    <value>西游记</value>
                    <value>水浒传</value>
                    <value>三国演义</value>
                </array>
            </property>
<!--    第四种: list注入 -->
            <property name="hobbys">
                <list>
                    <value>唱</value>
                    <value>跳</value>
                    <value>rap</value>
                </list>
            </property>
<!--    第五种:  Map注入        -->
            <property name="card">
                <map>
                    <entry key="身份证" value="1234567894545"/>
                    <entry key="银行卡" value="1234561235445"/>
                </map>
            </property>
<!--    第六种:  Set注入        -->
            <property name="games">
                <set>
                    <value>CF</value>
                    <value>CSGO</value>
                </set>
            </property>
<!--    第七种:  NULL        -->
            <property name="wife">
                <null/>
            </property>
<!--    第八种:  properties        -->
            <property name="info">
                <props>
                    <prop key="user">root</prop>
                    <prop key="password">121788</prop>
                </props>
            </property>
        </bean>
</beans>
Student(name=吉士先生,
address=Address(address=null),
books=[红楼梦, 西游记, 水浒传, 三国演义], 
hobbys=[唱, 跳, rap], 
card={身份证=1234567894545, 银行卡=1234561235445},
games=[CF, CSGO], 
wife=null, 
info={user=root, password=121788})

3.扩展式注入

p命名是Set方式注入,需要无参构造和set方法;c命名就是构造器注入,需要有参构造函数。

(1).P标签命名空间

p 命名空间注入,可以直接注入属性的值:

xmlns:p="http://www.springframework.org/schema/p"

强转的操作,利用Class映射进行强转

User user = context.getBean("user",User.class);

实体类

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
}

配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--  p: 标签命名空间  -->
        <bean id="user" class="Com.Jsxs.pojo.User" p:name="吉士先生" p:age="21"/>
</beans>

测试

@Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("userBeans.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user);
    }

(2).C标签命名空间

C通过构造器注入;

xmlns:c="http://www.springframework.org/schema/c"

配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--  p: 标签命名空间  -->
        <bean id="user" class="Com.Jsxs.pojo.User" p:name="吉士先生" p:age="21"/>
        <bean id="user2" class="Com.Jsxs.pojo.User" c:name="吉士先生" c:age="28"/>
</beans>
(3).总结
  • p命名是Set方式注入,需要无参构造和set方法;
  • c命名就是构造器注入,需要有参构造函数。
  • 用之前,别忘记导入约束

4.Bean作用域

(1).单列模式(默认为单列 singleton)

配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="user2" class="Com.Jsxs.pojo.User" c:name="吉士先生" c:age="28"/>
</beans>

测试

@Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("userBeans.xml");
        User user = context.getBean("user2",User.class);
        User user1 = context.getBean("user2",User.class);
        System.out.println(user==user1);
    }

相关文章
|
Java 数据库连接 mybatis
|
Java Spring 容器
spring之HttpInvoker
  一、HttpInvoker是常用的Java同构系统之间方法调用实现方案,是众多Spring项目中的一个子项目。顾名思义,它通过HTTP通信即可实现两个Java系统之间的远程方法调用,使得系统之间的通信如同调用本地方法一般。
2448 0
|
2月前
|
Java 开发者 Spring
Spring之AutowiredAnnotationBeanPostProcessor
`AutowiredAnnotationBeanPostProcessor`是Spring自动装配机制的核心组成部分,为开发者提供了强大的依赖注入功能。通过识别 `@Autowired`及其他相关注解,它可以减少设置依赖的样板代码,允许快速和容易地集成不同的Spring组件。由于其在Spring框架中的关键作用,掌握其原理和用法对于深入理解和正确使用Spring框架至关重要。通过其提供的默认功能以及定制化扩展能力,`AutowiredAnnotationBeanPostProcessor`能够满足各种复杂场景下的依赖注入需求。
33 0
|
4月前
|
XML Java 数据格式
|
5月前
|
Java 测试技术 数据库连接
Spring常见知识总结
Spring常见知识总结
25 2
|
5月前
|
Java 测试技术 容器
初识spring
初识spring
29 0
|
5月前
|
Java 程序员 Maven
|
Java Spring 容器
|
Java Spring
Spring 是什么?
Spring 是什么?
61 0
|
Java Spring 容器
Spring(二)
Spring(二)
84 0
Spring(二)
下一篇
无影云桌面