Spring简介以及常见的面试题(一)

框架(半成品软件)

高度抽取可重用代码的一种设计,高度的通用性;
框架:抽取成一种高度可重用的;事务控制,强大的servlet,项目中的一些工具。
    框架:多个可重用模块的集合,形成一个某个领域的整体解决方案;

常见的框架

SSH(老三大框架)

Struts2
Spring
Hibernate

SSM(新三大框架)

SpringMVC(WEB)
Spring(Service)
Mybatis(Dao)

Spring 框架

Spring是一个service层的框架,可以整合其他框架

容器(可以管理所有的组件(类))框架;

核心关注:IOC和AOP

IOC:- 控制反转
AOP:- 面向切面编程

案例一

第一步:先导入jar包

第二步:配置Spring容器约束文件

<?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="person01" class="cn.tedu.domain.Person01"></bean>
    <bean id="person02" class="cn.tedu.domain.Person01"></bean>
</beans>

案例一

/* spring 容器底层默认通过读取配置文件的类的全路径名,通过反射来创建对象
* 并保存到Spring容器的Map内存中并且通过键值对的形式储存,降低了程序的耦合性
* 通过getbean方法容器中找到匹配的键值对,来创建实例,多次获取同一个id的实例是同一个实例*/
public class Test01 {
    @Test
    public void test01(){
        //初始化容器,ApplicationContext是接口创建实现类对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext");
        //获取bean,获得对象
        Person01 p = (Person01) context.getBean("person01");
        //调用p的方法
        p.eat();
        p.sleep();
        System.out.println(p);
        //关闭容器
        ((ClassPathXmlApplicationContext) context).close();

    }
    //如果配置文件中包含两个id则会抛出异常 BeanDefinitionParsingException,
    // 这是因为Spring容器在存储对象时默认以键值对的形式存储的不能出现相同的key值
    @Test
    public void test02(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person01 p = (Person01) context.getBean("person01");
        System.out.println(p);

    }
    /*
    * Spring容器中可以包含相同的class属性,对应不同的id,且获取的是不同的实例*/
    @Test
    public void test03(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person01 p1 = (Person01) context.getBean("person01");
        Person01 p2 = (Person01) context.getBean("person02");
        System.out.println(p1);//cn.tedu.domain.Person01@6e0e048a
        System.out.println(p2);//cn.tedu.domain.Person01@5bc79255
        //关闭资源
        ((ClassPathXmlApplicationContext) context).close();

    }
}

案例二:创建bean的方式

//创建bean
    /*
    * Spring中默认是调用类的无参构造构造,通过反射来创建bean的
    * 如果没有无参构造构造就不能直接配置类的全路径名获得bean*/
    //Spring创建bean,没有无参构造构造,默认创建失败
public class Test04 {
    //java.lang.NoSuchMethodException:没有默认的无参构造
    @Test
    public void test01(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person01 p = (Person01) context.getBean("person01");
        System.out.println(p);

    }
    //通过反射创建对象
    //java.lang.InstantiationException: cn.tedu.domain.Person01
    //直接用clz.newstance,默认调用无参构造但只有含参数构造会抛出异常
    // Caused by: java.lang.NoSuchMethodException: cn.tedu.domain.Person01.<init>()
    @Test
    public void test02() throws Exception {
        Class<?> clz = Class.forName("cn.tedu.domain.Person01");
        Constructor<?> constructor = clz.getConstructor(String.class);
        Person01 p = (Person01) constructor.newInstance("reason");
        System.out.println(p);//cn.tedu.domain.Person01@1edf1c96
    }
    //普通方法创建对象
    @Test
    public void test03(){
        Person01 person01 = new Person01("xx");
        System.out.println(person01);

    }
}

案例三:利用工厂获取bean

1. 静态工厂
<?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="person01" class="cn.tedu.factory.Person01StaticFactory" factory-method="getInstance"></bean>
</beans>
//创建静态工厂
public class Person01StaticFactory {
    //私有化构造方法,不让外界随意的创建对象
    private Person01StaticFactory(){

    }
    //对外界提供公共的静态的getInstance的方法
    public static Person01 getInstance(){
        return new Person01("reason");
    }
}
//测试静态工厂
    @Test
    public void test05(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person01 person01 = (Person01) context.getBean("person01");
        System.out.println(person01);//cn.tedu.domain.Person01@3b084709
    }
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="person01InstanceFactory" class="cn.tedu.factory.Person01InstanceFactory" ></bean>
    <bean id="person01" factory-bean="person01InstanceFactory" factory-method="getInstance"></bean>
</beans>
//创建实例工厂
public class Person01InstanceFactory {
    public Person01 getInstance(){
        return new Person01("xx");
    }
}
//测试实例工厂
@Test
    public void test06(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
        Person01 person01 = (Person01) context.getBean("person01");
        System.out.println(person01);//cn.tedu.domain.Person01@3b084709
    }
3. Spring工厂
<?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">
<!--配置Spring工厂-->
    <bean id="person01" class="cn.tedu.factory.Person01SpringFactory"></bean>
</beans>
//创建SpringFactory需要实现FactoryBean接口指定泛型为获取实例的泛型
public class Person01SpringFactory implements FactoryBean<Person01> {
    @Override
    public Person01 getObject() throws Exception {
        //返回person01实例
        return new Person01("xx");
    }

    @Override
    public Class<?> getObjectType() {
        //返回实例的class对象
        return Person01.class;
    }

    @Override
    public boolean isSingleton() {
        //是否是单例,Spring默认全局只有一个实例
        return true;
    }
}
//测试Spring工厂
    @Test
    public void test07(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml");
        Person01 person01 = (Person01) context.getBean("person01");
        System.out.println(person01);//cn.tedu.domain.Person01@23e028a9
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值