Spring入门

Sprign Framework:Spring框架,是Spring中最早最核心的部分 也是其他技术的基础

SpringBoot:Spring是来简化开发,而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。

  • SpringCloud:这个是用来做分布式之微服务架构的相关开发。

IOC部分

bean的实例化

实例化bean的三种方式,构造方法,静态工厂实例工厂

bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。

1 构造方法实例化(常用)

Spring底层使用无参构造方法创建对象,在没有有参构造器的时候默认有无参构造器,因此使用构造方法实例化bean时直接在配置文件中配置即可

public class BookDaoImpl implements BookDao {

    @Override
    public void save() {
        System.out.println("dao save");
    }
}
<bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>
//测试bean实例化
public class TestDemo2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookDaoImpl bookDao = context.getBean("bookDao", BookDaoImpl.class);
        bookDao.save();
    }
}

运行结果:

为了验证是通过无参构造方法获取的 在无参构造方法中输出一句话验证

public class BookDaoImpl implements BookDao {

    public BookDaoImpl() {
        System.out.println("无参构造方法执行");
    }

    @Override
    public void save() {
        System.out.println("dao save");
    }
}

 运行结果:

 2 静态工厂实例化(了解)

3 实例工厂与FactoryBean

bean的基础配置

<!--bean属性-->
    <bean id="bookDao" class="com.dao.impl.BookDaoImpl" name="dao" scope="prototype"></bean>
//测试bean基础配置
public class TestDemo2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookDaoImpl bookDao1 = context.getBean("dao", BookDaoImpl.class);
        BookDaoImpl bookDao2 = context.getBean("dao", BookDaoImpl.class);
        System.out.println(bookDao1);
        System.out.println(bookDao2);
    }
}

测试结果:

 

<!--bean属性-->
    <bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>
//测试bean基础配置
public class TestDemo2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookDaoImpl bookDao1 = context.getBean("bookDao", BookDaoImpl.class);
        BookDaoImpl bookDao2 = context.getBean("bookDao", BookDaoImpl.class);
        System.out.println(bookDao1);
        System.out.println(bookDao2);
    }
}

 测试结果:

 

id:bean唯一标识

class:bean的类全名 必须为实现类

name:起别名 可起多个 使用(,)(;)( 空格)分割

scope:作用范围 

prototype:多例,多次获取的bean为多个
singleton:单例(默认) 多次获取的bean为同一个

bean的生命周期

1 在配置文件中的bean标签中添加init-methoddestroy-method属性

2 类实现InitializingBeanDisposableBean接口,了解

关闭容器的两种方式

ConfigurableApplicationContext是ApplicationContext的子类
close()方法
registerShutdownHook()方法

DI 属性注入 

setter注入

setter引用类型注入

1.在BookServiceImpl中声明bookDao属性

private BookDao bookDao;

2.为bookDao属性提供setter方法 

public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

3.在配置文件中使用property标签注入

<bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>

<bean id="bookService" class="com.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"></property>
    </bean>
//测试DI属性注入
public class TestDemo1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        bookService.save();
    }
}

 运行结果:

setter简单类型注入

public class UserDaoImpl implements UserDao {

    private String userName;

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public void name() {
        System.out.println("username is "+userName);
    }
}
<bean id="userDao" class="com.dao.impl.UserDaoImpl">
        <property name="userName" value="yuanyuan"></property>
//测试DI属性注入
public class TestDemo4 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);
        userDao.name();
    }
}

运行结果:

 

 

构造器注入

构造器引用类型注入

1.将bookDao的setter方法删除掉

2.添加带有bookDao参数的构造方法

public class BookServiceImpl implements BookService {

    private BookDao bookDao;

    public BookServiceImpl(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        System.out.println("service save");
        bookDao.save();
    }
}

3.在applicationContext.xml中配置

 <bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>
    <bean id="bookService" class="com.service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"></constructor-arg>
    </bean>
//测试DI属性注入
public class TestDemo1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        bookService.save();
    }
}

 测试结果:

 

构造器简单类型注入

public class UserDaoImpl implements UserDao {

    private String userName;

    public UserDaoImpl(String userName) {
        this.userName = userName;
    }

    @Override
    public void name() {
        System.out.println("username is "+userName);
    }
}
<bean id="userDao" class="com.dao.impl.UserDaoImpl">
        <constructor-arg name="userName" value="yuanyuan"></constructor-arg>
    </bean>
//测试DI属性注入
public class TestDemo4 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);
        userDao.name();
    }
}

测试结果:

 

依赖自动装配

依赖注入,需要注意一些其他的配置特征:

  1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作

  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用

  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用

  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合注入

public class ListDaoImpl implements ListDao {

    private int[] array;

    private List<String> list;

    private Set<String> set;

    private Map<String,String> map;

    private Properties properties;

    public void setArray(int[] array) {
        this.array = array;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

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

    @Override
    public void testDemo() {

        System.out.println("book dao save ...");

        System.out.println("遍历数组:" + Arrays.toString(array));

        System.out.println("遍历List" + list);

        System.out.println("遍历Set" + set);

        System.out.println("遍历Map" + map);

        System.out.println("遍历Properties" + properties);
    }
}
 <bean id="listDao" class="com.dao.impl.ListDaoImpl">
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <property name="list" >
            <list>
                <value>yuanyuan1</value>
                <value>yuanyuan2</value>
                <value>yuanyuan3</value>
            </list>
        </property>
<!--        set 去重-->
        <property name="set">
            <set>
                <value>mysql</value>
                <value>mysql</value>
                <value>java</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="name" value="yuanyuan"></entry>
                <entry key="password" value="1234"></entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="county">China</prop>
                <prop key="language">Chinese</prop>
            </props>
        </property>
    </bean>
</beans>
//测试DI属性注入
public class TestDemo5 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        ListDaoImpl listDao = context.getBean("listDao", ListDaoImpl.class);
        listDao.testDemo();
    }
}

测试结果:

 property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签
List的底层也是通过数组实现的,所以`<list>`和`<array>`标签是可以混用
集合中要添加引用类型,只需要把`<value>`标签改成`<ref>`标签,这种方式用的比较少

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值