Spring三大核心思想学习笔记

一:控制反转
**1.**Spring 三个核心思想是什么:控制反转,依赖注入和面向切面编程。

**2.**Spring最核心,最基础的概念是什么?将spring类比java,java最核心,最基础的概念就是object了。java中,所有的操作都是针对object的(基础类型除外),java中,一切皆对象,一切都是object。类比下来,spring中最基础的概念是bean。在spring中,所以的类都可以认为是一个bean。(个人认为)在spring中的所有文件,都可以认为是注册了的bean和未注册的bean。 spring中所有操作都是针对bean的操作。自然,spring的三大核心思想中操作的对象,也是bean.

3.代码讲解IOC控制反转
(1)定义一个接口


public interface IPrint {  
    /**   
    * onLine:  对象需要实现这个方法来实现打印对象的功能 
    * void  返回类型    
    */  
    String printObject();  
}  

(2)实现接口

public class UserBean implements IPrint{  
    @Override  
    public String printObject() {  
        // TODO Auto-generated method stub  
        System.out.println("打印对象UserBean:");  
        return "abc";  
    }  

}  

public class MyBean implements IPrint{  

    @Override  
    public String printObject() {  
        // TODO Auto-generated method stub  
        System.out.println("打印对象MyBean:");  
        return null;  
    }  
}  

(3)测试

IPrint print = new UserBean();  
print.printObject(); 

很正常的执行结果(“打印对象UserBean:”)。但是这时候我想修改一下,打印第二个实现类,这时候就需要修改代码了,修改代码毕竟是不符合开闭原则,又比较麻烦的事,这时候就需要用到spring的控制反转:对继承了接口IPrint的具体实现类的具体对象的创建,不依赖于调用他的客户端代码,而将控制权交给spring(其实就是xml文件),这就是控制反转。

4.控制反转实现

<?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:tx="http://www.springframework.org/schema/tx"  
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
    http://www.springframework.org/schema/tx  
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd  
    http://www.springframework.org/schema/aop    
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd   
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.2.xsd">  
    <!-- 注册bean --!>  
    <bean id="userBean" class="testSpring.business.bean.UserBean" />  
</beans>  


测试类:

/读取配置文件(将配置文件中的bean加载进内存)  
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/testSpring/resources/applicationContext.xml");  
        //获取的实例    
        IPrint bean=(IPrint)ctx.getBean("userBean");    
        //调用方法    
        bean.printObject(); 

如果想要打印另一个实现类,只要修改配置文件:

<bean id="userBean" class="testSpring.business.bean.MyBean" />  

总结:从spring的控制反转实现可以看出,客户端的实现不必去修改代码,从而达到了松耦合的目的。控制反转最后就是将主动权交给接口。

二:依赖注入
常用的注入方式有四种:
1. 属性注入
2. 构造方法注入
3. 工厂方法注入
4. 注解注入

(1)属性注入

package test;

public class User {
    private String name;
    private String gender;
    public String getName() {
        return name;
    }
    public User(String name, Integer age) {
    this.name = name;
    this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", gender=" + gender + "]";
    }
}

spring.xml文件配置:

    <bean id="user" class="test.User">
        <property name="name" value="cup"></property>
        <property name="gender" value="man"></property>
    </bean>

测试函数:


public static void main(String args[]){
    ApplicationContext atc = new ClassPathXmlApplicationContext("spring.xml");
    User user = (User) atc.getBean("user");
    System.out.println(user);//print User [name=cup, gender=man]
}

而如果我们把POJO中的getName方法去掉,结果不变,但setName方法删掉,我们再运行程序,会看到

(2)构造函数注入:
在xml文件定义Bean:




调用测试函数:

public static void main(String args[]){
    ApplicationContext atc = new ClassPathXmlApplicationContext("spring.xml");
    User user = (User) atc.getBean("user1");
    System.out.println(user.getName() + "——" + user.getAge());
    //print cup——25
}

(3)工厂方法注入
i.非静态工厂方法

先定义工厂类:

    package test;

    public class UserFactory {
        public User createUser(){
           User user = new User("cup",25);
           return user;
        }
    }

进行Bean配置:

<bean id="userFactory" class="test.UserFactory" />
<bean id="user3" factory-bean="userFactory" factory-method="createUser"></bean>

调用测试函数:

 public static void main(String args[]){
        ApplicationContext atc = new ClassPathXmlApplicationContext("spring.xml");
        User user = (User) atc.getBean("user3");
        System.out.println(user.getName() +" ——"+ user.getAge() );
        //print cup——25
    }

(4)注解注入

i. 对类成员变量注解

使用@Autowire实现自动注入,格式如:

@Component
public class IdCard{
    .....
}
public class User{
    //Autowired默认按类型注入,@required 表明如果找不到对应的bean则为null,但如果设定为true(也是默认值),则要求一定要找到匹配的bean,否则会抛出异常。
    //Qualifier常用于容器有一个以上相同类型的Bean,通过指定名字来指定唯一的Bean
    @Autowired(required = false )
    @Qualifier("idCard")
    private IdCard idCard;//也可以将IdCard配置在xml文件中注入
    .....
}

ii. 对类成员方法进行注解

@Autowired
public void init(@Qualifier(“usar1")User user1,@Qualifier("user2")User user2){
    this.user1 = user1;
    this.user2 = user2;
}
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值