Spring知识点

1、Spring

解决企业应用开发的复杂性

  • interface21

  • 2002年推出Spring雏形interface21

  • 2004年3月24日

  • Rod johnson

  • 不要重复的造轮子

理念 :使先有的技术更容易,整合和现有的技术框架

SSH:Struct2+Spring+Hibernate

SSM:SpringMvc +Spring +Mybatis

下载地址

官网:https://spring.io/

github:https://github.com/spring-projects/spring-framework

jar包 Spring-Jdbc+Spring Mvc

1.2、优点:

  • Spring是一个开源的免费(框架)容器
  • Spring是一个轻量级的、非非入侵使的框架
  • 支持事务的支持
  • 控制反转(IOC) 面向切面百编程

Spring就是一个轻量级的控制反转(IOC)和面相切面编程(AOP)的框架。

1.3、组成

image-20211104192459448

1.4、拓展

image-20211104192616064
  • Spring-Boot

    • 快速开发脚手架
    • 基于Spring-Boot可以快速开发是单个微服务
  • Spring-Cloud

    • Spring-Cloud基于Spring-Boot实现的

    学习Spring-Boot的前提是掌握Spring-Mvc及Spring

弊端:发展时间长。配置繁琐

2、IOC理论推倒

  1. UserDao

  2. USerDaoImpl

  3. UserService

  4. UserServiceImpl

  //方法赋值
    TestDaoImpl dao;

    public void setDao(TestDaoImpl dao) {
        this.dao = dao;
    }

3、hello Spring

4、IOC创建对象

​ 默认通过调用无参构造创建对象(无参构造创建对象)

实体类

package com.cxp.pojo;

import java.security.PrivateKey;


    @Override
    public String toString() {
        return "User{}";
    }

    public User(String name, Integer id) {
        System.out.println("有参构造");
        this.name = name;
        this.id = id;
    }

    public User() {
        System.out.println("无参构造");    }
	get和set方法......

bean.xml配置

<?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">
        <!--IOC创建对象-->
    <bean id="user" class="com.cxp.pojo.User">
        <property name="name" value="张三" />
    </bean>
</beans>
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
        User user = (User) applicationContext.getBean("user");

输出结果

无参构造

​ 通过有参构造器创建对象

  1. 通过下标<constructor-arg index=

      <bean id="user1" class="com.cxp.pojo.User">
        <constructor-arg index="0" value="李四"/>
        <constructor-arg index="1" value="1"/>
        </bean>
    
  2. 通过数据类型创建(不推荐)<constructor-arg type="java.lang.String" value="wangwu" />

  3. 直接通过参数来设置<constructor-arg name="name" value="张三" />(常用)

总结:Spring在加载是已经实例化了用的时候直接实例化

5、Spring配置

5.1、别名 alias

  <alias name="user3" alias="1234556" />

5.2、bean配置(重点)

<bean id="user4" class="com.cxp.pojo.User" name="cxp;1 2" >
    <constructor-arg name="name" value="张三" />
    <constructor-arg name="id" value="1" />
</bean>

5.3、import(导入合并多个配置文件)

 <?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="bean.xml" />
    
</beans>

6、DI(依赖注入)

6.1、构造器输入(4)

6.2、set注入

  • 依赖注入:set注入

    • 依赖:bean对象的创建依赖于容器
    • 注入:bean对象的所有属性,由容器来注入

    【环境搭建】

    1. 复杂环境

    实体类

        private  User user;
        private Map<String ,String> map;
        private String[] str;
        private List<String> list;
        private List<Map<String ,Object>> mapList; 
    get和set方法......
    
    <?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="bean.xml" />
    
       <bean id="user" class="com.cxp.pojo.User">
           <!--给user对象复制
    
           -->
       </bean>
        <bean id="student" class="com.cxp.pojo.Student">
            <!-- bean注入-->
            <property name="user" ref="user" />
        <!--给String[] 属组注入-->
            <property name="str">
                <array>
                    <value>张三</value>
                    <value>李四</value>
                    <value>wangwu</value>
                </array>
            </property>
            <!--list数组注入-->
            <property name="list" >
            <list>
                <value>听歌</value>
                <value>吃饭</value>
                <value>看书</value>
                <value>去玩</value>
            </list>
            </property>
            <!--map集合赋值-->
            <property name="map">
                <map>
                    <entry key="1" value="4" />
                    <entry key="2" value="5" />
                    <entry key="3" value="6" />
                </map>
            </property>
            <!--list<map> 赋值-->
            <property name="mapList" >
                <list>
                    <map>
                        <entry key="name" value="张三" />
                        <entry key="id" value="1" />
                        <entry key="age" value="12" />
                    </map> <map>
                        <entry key="name" value="李四" />
                        <entry key="id" value="1" />
                        <entry key="age" value="12" />
                    </map> <map>
                        <entry key="name" value="王五" />
                        <entry key="id" value="1" />
                        <entry key="age" value="12" />
                    </map>
                </list>
            </property>
            <!--给set赋值-->
            <property name="games">
                <set>
                    <value>lol</value>
                    <value>cf</value>
                </set>
            </property>
            <!--给自定义类型赋值-->
            <property name="info">
                <props>
                    <prop key="DRIVER">jdbc</prop>
                    <prop key="URL">127.0.0.1</prop>
                    <prop key="USERNAME">root</prop>
                </props>
            </property>
            <!--给null赋值-->
            <property name="wife">
                <null/>
            </property>
    
        </bean>
    </beans>
    

    输出结果

    Student{user=User{name='null', id=null}, map={1=4, 2=5, 3=6}, str=[张三, 李四, wangwu], list=[听歌, 吃饭, 看书, 去玩], mapList=[{name=张三, id=1, age=12}, {name=李四, id=1, age=12}, {name=王五, id=1, age=12}], games=[lol, cf], info={URL=127.0.0.1, DRIVER=jdbc, USERNAME=root}, wife='null'}
    
    1. 真实测试环境

6.3、第三方拓展注入

  • 命名空间赋值

    • C:命名(对应构造器注入)
    • P:命名(对应set注入 )

    注意:p命名和c命名赋值方法不能直接用要先配置xml配置

6.4、bean的作用域

  • singleton:单例模式(重点掌握)

    image-20211104212144384
    • 默认为单例可以显示设置
  • prototype:原型模式(重点掌握)

    image-20211104212348858
    • 每一次从容器中get的时候都是一个行新对象
  • request 、session 、application、websocket:

6.5、监听

7、Bean的自动装配

  • 自动装配是Spring满足bean依赖的一种方式
  • Spring会在上下文自动寻找,并给Bean装配属性

Spring中有三种装配方式

  1. 在Xml显示配置
  2. 在Java中显示配置
  3. 隐式的自动装配Bean(重要

7.1、测试

环境搭建

实体类

public class Dog {
    public void cry(){
        System.out.println("汪汪汪");
    }
}
public class Cat {
    public void cry(){
        System.out.println("喵喵喵");
    }
}
public class People {
        Cat cat;

        public Cat getCat() {
                return cat;
        }

        public void setCat(Cat cat) {
                this.cat = cat;
        }

        public Dog getDog() {
                return dog;
        }

        public void setDog(Dog dog) {
                this.dog = dog;
        }

        Dog dog;
<?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="cat" class="com.cxp.pojo.Cat" />
<bean id="dog" class="com.cxp.pojo.Dog" />
    <bean id="people" class="com.cxp.pojo.People">
        <property name="cat" ref="cat"/>
        <property name="dog" ref="dog"/>
    </bean>
</beans>

测试

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
        People people =  applicationContext.getBean("people",People.class);
        people.getCat().cry();
        people.getDog().cry();

    }
}

结果

喵喵喵
汪汪汪

7.2、自动装配(autowire)

  • byName
  • ByType
<bean id="people" class="com.cxp.pojo.People" autowire="byName">
   
    </bean>
class="com.cxp.pojo.People" autowire="ByType">
   
    </bean>

7.3、注解装配

@AutoWired

可以省略Set方法

jdk1.5开始注解

Spring 2.5开始注解

使用注解须知

  1. 导入约束
  2. 指定要扫描的包<context:component-scan base-package=""/>配置注解的支持 <context:annotation-config/>
    <context:component-scan base-package="com.cxp"/>
<bean id="cat" class="com.cxp.pojo.Cat" />
<bean id="dog" class="com.cxp.pojo.Dog" />
    <bean id="people" class="com.cxp.pojo.People" autowire="byName"/>

科普

@Autowired()

@Nullable 字段标记了这个注解 说明这个字段可以为Null

如果@Autowired自动装配面对复杂的装配环境,自动装配无法通过一个注解@Autowired完成的时候可以用@Qualifler(value="xxx")去配置@Autoeired的使用指定一个唯一的bean的对象注入

java的原生注解 @Resource

小结:@autowirde@Resource的区别

  1. 都是用来自动装配的,都可以放在属性字段上
  2. @autowirde通过byType的方式实现,而且必须存在这个对象(常用)
  3. @Resource 默认通过ByName的方式实现,如果找不到名字,则通过ByType的方式实现!如果两个都找不到的情况就报错
  4. 执行顺序不同:@autowirde 通过BytType方式实现 @Resource默认通过ByName方式实现

8、使用注解开发

  1. 添加注解支持

@Componet 组件放在类上说明 @value 赋值

衍生注解

  • dao【@Repository】
  • service【@Service】
  • controller【@Controller】

这四个注解的功能都是一样的

@scope

小结

xml与注解

  • xml更万能,适用于各种场合!维护简单
  • 注解不是自己的类就不能用,维护相对复杂

xml于注解的最佳实践

  • xml用来管理bean
  • 注解只负责完成属性注入

9、新特性 使用Java的方式配置Spring

纯Java的注解字在SpringBoot中非常常见

posted @ 2021-11-06 22:04  萌新Newcxp  阅读(67)  评论(0)    收藏  举报