首页 > 编程语言 > 详细

Spring(二)

时间:2021-02-03 23:25:54      阅读:50      评论:0      收藏:0      [点我收藏+]

Spring(二)

HelloSpring

  • 实体类
@Data
public class Hello {
    public String str;
}
  • 配置文件beans.xml
<?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来创建对象,在Spring中这些都称为Bean-->
    <bean id="hello" class="com.yhr.pojo.Hello">
        <property name="str" value="Spring"/>
    </bean>

</beans>
  • 测试
@Test
public void test(){
    //获取Spring的容器,通过容器获取对象
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    Hello hello = context.getBean("hello", Hello.class);
    System.out.println(hello);
}

IoC创建对象的方式

  • 默认使用无参构造创建对象
    • <property name="name" value="yhr"/>
  • 在获取ApplicationContext时就已经创建了对象,并且进行初始化
    • getBean方法得到的永远是同一个对象(单例模式)
  • 使用有参构造:
    • 下标赋值:<constructor-arg index="0" value="yhr"/>
    • 类型赋值:<constructor-arg type="java.lang.String" value="yhr"/>
    • 参数名赋值:<constructor-arg name="name" value="yhr"/>

Spring配置

别名

<alias name="user" alias="abc"/>
  • 可以使用别名获取对象

bean的配置

  • id:bean的唯一标识符,也就是对象名
  • class:对应类型的全限定名
  • name:别名
    • 可以同时取多个别名,在字符串内用逗号、分号、空格等区分

import

  • 将多个配置文件导入合并为一个

依赖注入DI

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

构造器注入

  • constructor-arg标签
  • 必须要有有参构造器

Setter方式注入

  • 必须要有无参构造和setter方法
  • 实体类Student和Address
@Data
public class Address {
    private String address;
}

@Data
public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbies;
    private Map<String, String> cards;
    private Set<String> games;
    private String wife;
    private Properties info;
}
  • 注入方式:
<bean id="address" class="com.yhr.pojo.Address">
    <property name="address" value="成华大道"/>
</bean>

<bean id="student" class="com.yhr.pojo.Student">
    <!--普通注入,value-->
    <property name="name" value="yhr"/>
    <!--bean注入,ref-->
    <property name="address" ref="address"/>
    <!--数组注入-->
    <property name="books">
        <array>
            <value>西游记</value>
            <value>三国演义</value>
            <value>水浒传</value>
            <value>红楼梦</value>
        </array>
    </property>
    <!--List注入-->
    <property name="hobbies">
        <list>
            <value>听歌</value>
            <value>敲代码</value>
            <value>看电影</value>
        </list>
    </property>
    <!--Map注入-->
    <property name="cards">
        <map>
            <entry key="身份证" value="123456"/>
            <entry key="银行卡" value="234567"/>
        </map>
    </property>
    <!--Set注入-->
    <property name="games">
        <set>
            <value>LOL</value>
            <value>DOTA2</value>
        </set>
    </property>
    <!--null值注入-->
    <property name="wife">
        <null/>
    </property>
    <!--Properties注入-->
    <property name="info">
        <props>
            <prop key="学号">202022010314</prop>
            <prop key="性别">男</prop>
        </props>
    </property>
</bean>

拓展方式注入

p命名空间

  • beans标签加入属性xmlns:p="http://www.springframework.org/schema/p"
<!--p命名空间注入,可以直接注入属性的值:property-->
<bean id="user" class="com.yhr.pojo.User" p:name="yhr" p:age="18"/>
  • 必须有无参构造和set方法

c命名空间

  • 导入c命名空间xmlns:c="http://www.springframework.org/schema/c"
<!--c命名空间注入,可以直接通过构造器注入:constructor-arg-->
<bean id="user2" class="com.yhr.pojo.User" c:name="yhr" c:age="18"/>
  • 必须有有参构造

Bean的作用域

  • bean标签的scope属性,可以有如下设置
    • singleton(默认):单例模式,全局唯一
    • prototype:原型模式,每次从容器中get时,都会产生一个新的对象
    • request、session、application、websocket在Web开发中使用

Bean的自动装配

  • 自动装配是Spring满足bean依赖的一种方式
  • Spring会在上下文中自动寻找,并给bean装配属性
  • 三种装配方式:
    • 在xml中显式配置
    • 在java中显式配置
    • 隐式的自动装配(autowire)

ByName自动装配

  • 会自动在容器上下文中查找,和自己对象setter方法后面的值对应的beanid
<bean id="cat" class="com.yhr.pojo.Cat"/>
<bean id="dog" class="com.yhr.pojo.Dog"/>

<bean id="people" class="com.yhr.pojo.People" autowire="byName">
    <property name="name" value="yhr"/>
</bean>

ByType自动装配

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

  • 可以没有id,但必须保证类型唯一

<bean id="cat" class="com.yhr.pojo.Cat"/>
<bean id="dog111" class="com.yhr.pojo.Dog"/>

<bean id="people" class="com.yhr.pojo.People" autowire="byType">
    <property name="name" value="yhr"/>
</bean>

使用注解实现自动装配

  • jdk1.5支持注解,Spring2.5支持注解

  • 导入context约束

  • 配置注解的支持<context:annotation-config/>

<?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>
  • @Autowired注解修饰属性,需要有参构造

    • @Autoowired(required=false)表示属性可以为空
      • @Nullable修饰构造函数中的参数,参数可以为空
  • @Qualifier(value = "")显式指定bean的id

  • @Resourcejava自带的注解,也可以实现自动装配

    • 可以通过name属性指定id

使用注解开发

  • 在Spring4之后,要使用注解开发,必须导入aop的包
  • 需要导入context约束
  • 扫描指定的包
<!--扫描指定的包-->
<context:component-scan base-package=""/>

bean

  • @Component修饰类,等价于注册了一个bean,id为类名小写

属性注入

  • @Value("yhr")修饰属性,相当于property标签
  • 引用类型使用@Autowired

衍生注解

  • @Component有几个功能相同的衍生注解,在web开发中,按照MVC三层架构分层:
    • dao:@Repository
    • service:@Service
    • controller:@Controller

作用域

  • @Scope(""):value中填写作用域

小结

  • xml更加万能,适用于任何场合,维护简单方便
  • 注解维护相对复杂
  • 最佳实践:
    • xml用来管理bean
    • 注解只负责完成属性的注入

使用Java的方式配置Spring

  • 在Spring4后,JavaConfig成为了一个核心功能
@Configuration
public class AppConfig {
    @Bean
    public User getUser(){
        return new User();
    }
}
  • 方法名为bean的id,返回值为bean的类

  • 也可以使用@ComponentScan("package")进行扫描,就不需要写方法注册了

  • 测试时使用new AnnotationConfigApplicationContext(AppConfig.class)来获取上下文

  • 使用@Import(AppConfig2.class)来引用另一个配置类

Spring(二)

原文:https://www.cnblogs.com/xiafrog/p/14369002.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!