spring01

1、IOC(控制反转)

(程序主动权由程序员转移到用户手中)是一种设计思想,是spring的核心内容,可以用xml配置,也可以用注解配置。

DI(依赖注入)是实现IOC的一种方法。

ctrl+alt+u快捷键(显示继承关系)

  • ref:引用spring容器中已经创建好的对象

  • value:具体的值,基本数据类型

问题一:context无法获取getBean方法

IOC创建对象的方式:

  • 一、使用无参构造创建对象,默认!

  • 二、假如要使用有参构造

      	<!--第一种:下标赋值-->
    
      		<bean id="user" class="com.heu.pojo.User">
    
      				 	<constructor-arg index="0" value="李四"/>
    
      		</bean>
    
      	<!--第二种:通过类型创建,不建议使用-->
    
      		<bean id="user" class="com.heu.pojo.User">
    
      				<constructor-arg type="java.lang.String" value="王五"/>
    
      		</bean>
    
      	<!--第三种:直接通过参数名设置-->
    
      		<bean id="user" class="com.heu.pojo.User">
    
      			 <constructor-arg name="name" value="张三"/>
    
      		</bean>
    

在配置文件加载的时候,容器中管理的对象就被实例化了

2、Spring的配置

  • alias(别名)也可以用别名获取到这个对象

  • bean:
    id:bean的唯一标识符
    class:bean对象所对应的全限定名:包名+类名
    name:也就是别名,而且name可以同时取多个别名

  • import:一般用于团队开发使用,他可以讲多个配置文件,导入合并为一个

3、DI依赖注入

  • (一)构造器注入

  • (二)set方式注入【重点】
    依赖注入:set注入

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

环境搭建:

1.复杂类型


public class Address {
    private String address;
    public String getAddress() {
        return address;

    }

    public void setAddress(String address) {
        this.address = address;

    }

}

2.真实测试对象

public class Student {
    private String name;

    private Address address;

    private String[] books;

    private List<String> hobbys;

    private Map<String,String> card;

    private Set<String> games;

    private String wife;

    private Properties info;

3.beans.xml

<!--第一种,普通注入,直接通过value赋值-->

    <property name="name" value="张三"/>

    <!--第二种,Bean注入,ref-->

    <property name="address" ref="address"/>



    <!--数组-->

    <property name="books">

        <array>

            <value>水浒传</value>

            <value>三国演义</value>

            <value>红楼梦</value>

            <value>西游记</value>

        </array>

    </property>



    <!--list-->

    <property name="hobbys">

        <list>

            <value>游戏</value>

            <value>学习</value>

        </list>

    </property>



    <!--map-->

    <property name="card">

        <map>

            <entry key="身份站" value="23456"/>

            <entry key="银行卡" value="669059678769"/>

        </map>

    </property>



    <!--set-->

    <property name="games">

        <set>

            <value>lol</value>

            <value>kkk</value>

        </set>

    </property>



    <!--null-->

    <property name="wife">

        <null/>

    </property>



    <!--properties-->

    <property name="info">

        <props>

            <prop key="学号">12345678</prop>

            <prop key="性别"></prop>

        </props>

    </property>

</bean>
  • (三)拓展方式注入

命名空间注入,可以直接注入属性的值,需要加上下面的约束

xmlns:p=“http://www.springframework.org/schema/p”

xmlns:c=“http://www.springframework.org/schema/c”

<!--p命名空间注入,无参构造-->

<bean id="user" class="com.heu.pojo.User" p:name="张三" p:age="22"/>



<!--c命名空间注入,有参构造-->

<bean id="user2" class="com.heu.pojo.User" c:name="李四" c:age="22"/>

4、Bean的作用域

  • singleton(单例模式)spring默认机制
  • prototype(原型模式)每次从容器种get的时候,都会产生一个新对象
  • request
  • session
  • application
  • websocket

5、Bean的自动装配

自动装配是spring满足Bean依赖的一种方式

spring在会在上下文种自动寻找,并自动给bean装配属性

在spring中有三种装配方式

  • 1、在xml中显示配置

  • 2、在Java中显示配置

  • 3、隐式的自动装配bean[重要]

自动装配

byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid

需要保证所有bean的id唯一

byType:会自动在容器上下文中查找,和自己对象属性类型相同的beanid

需要保证所有bean的class唯一

使用注解实现自动装配

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启注解支持-->
    <context:annotation-config/>
</beans>

要使用注解须知

  • 1、导入约
    xmlns:context=“http://www.springframework.org/schema/context”

  • 2、配置注解的支持
    context:annotation-config/

@Autowired

直接在属性上使用即可

使用Autowired可以不用编写set方法,前提是这个自动装配的属性在ioc(spring)容器中存在且符合名字。

小结:
@ Resourcee和@ Autowired的区别:

  • 都是用来自动装配的,都可以放在属性字段上
  • @ Autowired通过byname的方式实现,如果找不到名字,则通过byType实现,如果都找不到,就报错
  • @ Resourcee通过byType的方式实现,如果找不到名字,则通过byname实现,如果都找不到,就报错
  • 执行顺序不同:@ Autowired通过byType的方式实现;@ Resourcee默认通过byname的方式实现

6、注解说明

  • @Autowired : 自动装配通过类型、名字,如果Autowired 不能唯一自动装配上属性,则需要通过@Qualifier(value=“xxx”);
  • @Nullable : 字段标记了这个注解,说明这个字段可以为null;
  • @Resource : 自动装配通过名字、类型
  • @Component :组件,放在类上,说明这个类被spring管理了,就是bean

7、使用注解开发

要使用注解开发,必须要导入aop包

使用注解要导入context约束,增加注解的支持

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!--指定要扫描的包,这个包下的注解会生效-->
    <context:component-scan base-package="com.heu.pojo"/>
    <context:annotation-config/>
</beans>
  • 1.bean

  • 2.属性如何注入

//等价于<bean id="user" class="com.heu.pojo.User"/>
//@Component 组件
@Component
public class User {

    
    public String name;

    //相当于<property name="name" value="张三"/> 
    @Value("张三")
    public void setName(String name) {
        this.name = name;
    }
}
  • 3.衍生的注解
    @Component有几个衍生注解,在web开发中,会按照mvc三层架构分层
    - dao:[@Repository]
    - service:【@Service】
    - controller:【@Controller】

     这四个注解功能都是一样的,都是代表将某个类注册到spring中,装配bean
    
  • 4.自动装配置

    • @Autowired : 自动装配通过类型、名字,如果Autowired 不能唯一自动装配上属性,则需要通过@Qualifier(value=“xxx”);
    • @Nullable : 字段标记了这个注解,说明这个字段可以为null;
    • @Resource : 自动装配通过名字、类型
  • 5.作用域
    -@Scope(“singleton”)

  • 6.小结
    xml与注解:
    -------xml更加万能,适用于任何场合,维护简单方便
    -------注解不是自己的类使用不了,维护相对复杂
    xml与注解最佳实践:
    -------xml用来管理bean
    -------注解只负责完成属性的注入
    -------在使用时,要让注解生效,就要开启注解支持

<!--指定要扫描的包,这个包下的注解会生效-->
    <context:component-scan base-package="com.heu"/>
    <context:annotation-config/>

8、使用Java的方式配置spring

完全不使用spring的xml配置,全权交给Java做

实体类

@Component
public class User {

    private String name;


    public String getName() {
        return name;
    }

    @Value("张三")
    public void setName(String name) {
        this.name = name;
    }
}

配置类

//@Configuration本身也是一个@Component,所以也会被注册到spring容器中,
// @Configuration代表这是一个配置类,就和beans.xml一样
@Configuration
public class MyConfig {

    //注册一个bean,就相当于之前写的一个bean标签,
    // 这个方法的名字,就相当于bean标签中的id属性,
    // 这个方法的返回值,就相当于bean标签中的class属性
    @Bean
    public User user(){
        return new User();
    }

}

测试类

public class MyTest {

    @Test
    public void test01(){

        //如果完全使用配置类方式做,就只能通过AnnotationConfigApplicationContex()来获取容器,通过配置类的class对象加载
        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        User user = context.getBean("user", User.class);
        System.out.println(user.getName());

    }

}

9、代理模式

springAOP的底层就是代理模式 【SpringAOP 和 SpringMVC】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值