Web安全

Java Spring学习

Posted on 2020-09-17,7 min read

Spring程序的步骤

xxx.java调用Spring.getBean(ID标识)
然后Spring框架去XML配置文件中获得ID标识对应的Bean类名
然后通过反射创建ean对象。返回对象

在Spring配置文件中。
<bean id="Helloclass" class="HelloWorld" scope="prototype">
scope取值为singleton时

Bean只会实例化一个类
并且在ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
加载配置文件时。就实例化了类
容器在。对象就一直在
应用卸载。对象被销毁

scope取值为prototype时

Bean会实例化多个类
在HelloWorld hello = (HelloWorld) context.getBean("Helloclass");
获取Bean才会实例化类
对象在使用中。就会存活
对象不用。就会销毁

指定初始化方法和销毁方法

在配置文件中添加
init-method="init" destroy-method="destory"
在实现类中添加对应的init函数和destory函数。就能在类初始化和销毁时执行函数

工厂静态方法实例化

就是将某个函数如下编写
public static 类名 class(){
    return new 类名();
}
在spring配置文件中。
<bean id="User" class="HelloWorld" factory-method="save" />
这样。在查找User类的时候。就会通过HelloWorld类中的save方法查找

工厂实例方法实例化

    <bean id="UserDaoDemo" class="UserDaoDemo" init-method="init" destroy-method="destory" />
    <bean id="test" factory-bean="UserDaoDemo" factory-method="save" />
    就是执行一个类名和方法名

导入其他配置文件

<import resource="applicationContext-user.xml" />
<import resource="xxxxxxxxxx.xml" />

依赖注入:
比如现在。我有一个UserDao接口。然后UserDaompl类去实现接口

UserService接口。UserServicempl类去实现接口

这里UserServicempl类。想要调用UserDaompl类中的save方法。输出字符串。
定义了一个set方法。然后UserServicempl类的save()方法。调用this.UserDaompl的save()方法
这就存在依赖问题。我们可以在配置文件中。直接把定义的类当作参数传入

    <bean id="UserDao" class="UserDaompl" />
    <bean id="UserService" class="UserServicempl">
        <property name="userDaompl" ref="UserDao"></property>
    </bean>
    一个UserService标识。对应UserServicempl类
    然后userDaompl对应set方法的参数类型。然后传入参数是UserDao

利用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 id="UserDao" class="UserDaompl" />

    <bean id="UserService" class="UserServicempl" p:userDaompl-ref="UserDao"></bean>
</beans>

前面添加一个xmlns:p="http://www.springframework.org/schema/p"
后面直接加上p:set函数名-ref="参数"

利用构造函数依赖

public class UserServicempl implements  UserService{
    private UserDaompl UserDaompl;
    public UserServicempl(){}
    public UserServicempl(UserDaompl UserDaompl){
        this.UserDaompl = UserDaompl;
    }
    @Override
    public void save() {
        UserDaompl.save();
    }
}

然后spring-config.xml配置如下

    <bean id="UserService" class="UserServicempl">
        <constructor-arg name="UserDaompl" ref="UserDao"></constructor-arg>
    </bean>

UserDaompl是参数名。UserDao传入的标识符

之前我们注入的一直是对象。
现在来注入点字符串。数字
还是原来的类。只不过我们添加了

 private String Name;

    public void setName(String name) {
        Name = name;
    }

    public void setAge(int age) {
        Age = age;
    }

    private int Age;

最后我们配置spring-config.xml

    <bean id="UserService" class="UserServicempl">
        <property name="Age" value="19" />
        <property name="Name" value="Guoke" />
    </bean>


    <property>里面写构造函数的参数。后面跟值

配置集合数据类型

private List<String> strList;
    private Map<String,User> userMap;
    private Properties properties;

    public void setStrList(List<String> strList) {
        this.strList = strList;
    }

    public void setUserMap(Map<String, User> userMap) {
        this.userMap = userMap;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

spring-config.xml配置

    <bean id="UserService" class="UserServicempl">
    <!--这里是List的配置方式-->
        <property name="strList">
            <list>
                <value>abc</value>
                <value>fdfddf</value>
                <value>xx</value>
            </list>
        </property>
    <!--这里是Usermap的配置方式。最后面定义了两个类。分别给了两个标识。并且set函数存入数据-->
        <property name="userMap">
            <map>
                <entry key="user1" value-ref="User1"></entry>
                <entry key="user2" value-ref="User2"></entry>
            </map>
        </property>
<!--这里是properties的配置方式。props内部还有prop-->
        <property name="properties">
            <props>
                <prop key="a1">pp1</prop>
                <prop key="a2">pp2</prop>
            </props>
        </property>
    </bean>

    <bean id="User1" class="User">
        <property name="addr" value="shaoxing"></property>
        <property name="name" value="guoke"></property>
    </bean>
    <bean id="User2" class="User">
        <property name="addr" value="lishui"></property>
        <property name="name" value="xxx"></property>
    </bean>

Spring相关的API
AplicationContext的实现类

ClassPathXmlApplicationContext
从类的根路径加载配置文件
FileSystemXmlApplicationContext
从磁盘路径加载配置文件
AnnotationConfigApplicationContext
用注解配置容器。需要使用此类

getBean() 方法使用
之前我们获取class都是用ID对应xml中的class获取的
这里getBean复写了。可以用类型获取

UserService user = app.getBean(UserService.class);

下一篇: 羊城杯 Easy Java(jdbc反序列化)→