SpringIOC

XML方式:

IOC:控制反转的底层原理就是:工厂模式+反射+配置文件 DI:依赖注入就是通过配置文件设置属性值

BeanFactory 是老版本的工厂类:调用getBean的时候,才会生成类的实例 ApplicationContext 是新版本的工厂类:加载配置文件的时候,就会将Spring管理的类都实例化

ApplicationContext有两个实现类: ClassPathXmlApplicationContext :加载类路径下的配置文件 FileSystemXmlApplicationContext :加载文件系统下的配置文件

<bean>标签 id 使用了约束中的唯一约束,里面不能出现特殊字符 name 没有使用约束中的唯一约束(理论上可以重复,实际开发中不能出现重复),可以出现特殊字符

bean生命周期的配置 init-method:Bean被初始化的时候执行的方法 destroy-method: Bean被销毁的时候的方法(Bean是单例创建,工厂关闭)

Bean作用范围的配置: scope Bean的作用范围 singleton 默认的,Spring会采用单例模式创建这个对象 prototype 多例模式,用一次new一个(Struts2和spring整合的时候一定会用到)

P名称空间的属性注入 普通属性   p:属性名="值" 对象属性   p:属性名-ref="值"

代码如下

public interface UserService {
    public void save();
}
public class UserServiceImpl implements UserService {
    private String name;
    private String age;
    private String price;
    private Student student;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public void save() {
        System.out.println("save..name=" + name + ";age=" + age + ";price=" + price + ";student=" + student);
    }

    public void init() {
        System.out.println("init");
    }

    public void destroy() {
        System.out.println("destroy");
    }
}
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Student {
    private String name;
    private String[] arrs;
    private List<String> list;
    private Set<String> set;
    private Map<String, String> map;

    public void setName(String name) {
        this.name = name;
    }

    public void setArrs(String[] arrs) {
        this.arrs = arrs;
    }

    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;
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", arrs=" + Arrays.toString(arrs) +
                ", list=" + list +
                ", set=" + set +
                ", map=" + map +
                '}';
    }
}

配置文件

ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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="userDAO" class="com.jinke.demo.UserServiceImpl" init-method="init" destroy-method="destroy"
          p:age="30" p:price="2000" p:student-ref="student">
        <property name="name" value="李东"/>
    </bean>
    <import resource="ApplicationContext2.xml"/>
</beans>

ApplicationContext2.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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="student" class="com.jinke.demo.Student" p:name="学生">
        <property name="arrs">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </list>
        </property>
        <property name="list">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>a</value>
                <value>b</value>
                <value>c</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="1" value="a"/>
                <entry key="2" value="b"/>
                <entry key="3" value="c"/>
            </map>
        </property>
    </bean>

</beans>

执行

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo1 {

    @Test
    public void demo() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        UserService userService = (UserService) applicationContext.getBean("userDAO");
        userService.save();
        ((ClassPathXmlApplicationContext) applicationContext).close();
    }
}

得到结果

save..name=李东;age=30;price=2000;student=Student{name='学生', arrs=[张三, 李四, 王五], list=[1, 2, 3], set=[a, b, c], map={1=a, 2=b, 3=c}}
六月 11, 2019 6:40:17 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6842775d: startup date [Tue Jun 11 18:40:16 CST 2019]; root of context hierarchy
destroy

注解的方式

Spring包括的模块

web层:springmvc service层:bean管理,声明式事物 DAO层:ORM模块、jdbc模板

IOC注解方式,可以不提供set方法 属性如果有set方法,注解添加到set方法上,没有set方法就添加到属性上

注解详解 @Component:组件 衍生:@Controller web层的类、@Service service层的类、@Repository DAO层的类(一般用这个)

普通属性:@Value 对象属性:@Autowired 习惯是和@Qualifier一起使用

@Resource(一般用这个)

生命周期相关注解 @PostConsruct 初始化 @PreDestroy 销毁

Bean作用范围 @Scope(singleton/prototype)

代码如下

public interface UserDAO {
    public void save();
}
public interface UserService {
    public void save();
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

@Repository(value = "userDao")//相当于<bean id = "userDao" class="com.jinke.demo1.UserDAOImpl"/>
public class UserDAOImpl implements UserDAO {
    @Value("大傻")
    private String name;

    /*@Value("大傻")
    public void setName(String name) {
        this.name = name;
    }*/
    /*@Autowired
    @Qualifier(value = "userService222")*/
    @Resource(name = "userService222")
    private UserService userService;

    @Override
    public void save() {
        System.out.println("UserDAOImpl被执行了--name=" + name);
        userService.save();
    }

    @PostConstruct//相当于init-method
    public void init() {
        System.out.println("UserDAOImpl被执行了init");
    }

    @PreDestroy//相当于destroy-method
    public void destroy() {
        System.out.println("UserDAOImpl被执行了destroy");
    }

}
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service("userService222")
@Scope("singleton")
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("UserServiceImpl的save被执行了");
    }
}

配置文件

<?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
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.jinke.demo1"/>
</beans>

执行

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo1 {
    @Test
    public void demo1() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext3.xml");
        UserDAO userDao = (UserDAO) applicationContext.getBean("userDao");
        userDao.save();
        ((ClassPathXmlApplicationContext) applicationContext).close();
    }
}

输出结果

UserDAOImpl被执行了init
UserDAOImpl被执行了--name=大傻
UserServiceImpl的save被执行了
六月 12, 2019 4:25:36 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6842775d: startup date [Wed Jun 12 16:25:36 CST 2019]; root of context hierarchy
UserDAOImpl被执行了destroy

总结:一般XML用来管理Bean,注解完成属性注入

本文分享自微信公众号 - 安卓圈(gh_df75572d44e4)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 细说RESTful API安全之概述

    目前许多前后端应用都采取REST架构风格,前端应用和后端服务通过API进行数据交换。 通过REST API在网络中进行数据交换时很容易被网络抓包,然后进行恶意批...

    2Simple
  • 细说log4j之log4j 2.x

    从图中可以看出,log4j2中的主要组件为:Filter,Appender,Logger,他们的层次关系为: Configuration -- Fi...

    2Simple
  • 分布式监控-open-falcon

    操作系统:centos7(minimal,www.centos.org下载的包是CentOS-7-x86_64-Minimal-1611.iso)

    yaohong
  • JS --- 延迟加载的几种方式

    标题:JS延迟加载,也就是等页面加载完成之后再加载 JavaScript 文件。    JS延迟加载有助于提高页面加载速度。

    小蔚
  • 细说java平台日志组件

    JDK自带日志组件,使用方式简单,不需要依赖第三方日志组件。 支持将日志打印到控制台,文件,甚至可以将日志通过网络打印到指定主机。 相对于第三方独立日志框架来...

    2Simple
  • 细说log4j之log4j 1.x

    官网:http://logging.apache.org/log4j/1.2/manual.html

    2Simple
  • Log4j 1.x JDBCAppender记录日志失效问题详解

    官网:http://logging.apache.org/log4j/1.2/manual.html

    2Simple
  • 细说log4j之概述

    log4j目前存在2个版本:log4j 1.x 和log4j 2.x,目前官方主推2.x版本(log4j 1.x已于2015.08.05宣布停止开发,官方建议将...

    2Simple
  • docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面

    docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径

    yaohong
  • python--inspect模块

    1. inspect.getmembers(object[, predicate])

    yaohong

扫码关注云+社区

领取腾讯云代金券