DAY16 spring、注入方式、C/P命名空间

首先导入 spring maven的包 Spring Web MVC(spring有很多包,导入Spring Web MVC包,它会自动引入其他包),随后会用到spring-jdbc依赖,Spring就是一个大杂烩

一、

SSH(过时) Struct2 + Spring + Hibernate

SSM          SpringMVC +Spring +Mybatis

优点1、 Spring是一个开源的免费容器  2、一个轻量级的非入侵式的框架 3、控制反转IOC,面向切面编程AOP  4、支持事务处理 

二、Spring

Spring的七大模块AOP , ORM,DAO,WEB,Context,Web MVC ,Spring Core

Spring Boot 快速开发脚手架,约定大于配置

Spring Cloud 基于SpringBoot实现

唯一的弊端:发展太久,违背了原来理念,配置十分繁琐!!!

三、IOC的原型: 之前service层调用dao层的  接口(将dao层的接口实现类对象new的方式注入),现在service层增加的set方法,this.name=name,以形参传入dao层接口,dao层实现类注入对象随形参改变。1、set注入,2、构造器注入,3、其他方式注入

public interface UserService {
   public void setUserDao(UserDao userDao);
   public void getUser();
}
package com.rzgsl.service;
import com.rzgsl.pojo.UserDao;

public class UserServiceImpl implements UserService {
    private UserDao userDao ;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void getUser() {
        userDao.getUser();
    }
}
public class MyTest {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        userService.setUserDao(new PersonDaoImpl());
        userService.getUser();

注意:在MyTest中,如果在UserService接口中没有setUserDao方法,那么这里得用 UserServiceImpl userService = new UserServiceImpl();

反转实现目的:原来在对象在程序员手上,现在反转给用户,耦合性降低

四、Bean创建对象

package com.rzgsl.pojo;

public class Hello {
    private String str;

    private String getStr(){
        return str;
    }
    public void setStr(String str){
        this.str=str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

依赖注入:就是调用类的set方法注入

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    用spring创建对象,都称为bean-->
    <bean id="personDaoImpl" class="com.rzgsl.pojo.PersonDaoImpl"></bean>
    <bean id="userDaoImpl" class="com.rzgsl.pojo.UserDaoImpl"></bean>
    <bean id="student" class="com.rzgsl.pojo.Student">
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
        <property name="user" value="zhangsan"/>
        <property name="psw" value="123456"/>
    </bean>
    <bean id="teacher" class="com.rzgsl.pojo.Teacher">
        <constructor-arg name="name" value="李四"></constructor-arg>
    </bean>
       </beans>

xml创建对象,和java创建对象相同点。bean的id相当于对象名;class是全路径  ;property是设置属性

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//        Student student = (Student) context.getBean("student");
//        student.getAge();
        Teacher teacher = (Teacher) context.getBean("teacher");
        teacher.toString();

注意:java调用无参构造时就创建了对象,如果要增加有参构造,那么在java类中也应该留有参构造方法,构造方法要写上this.name = name。

起一个applicationContext.xml的文件,这是正规的叫法,import标签导入进来其他的resource,每一个标签都是一个bean.xml文件,这样不同程序员编写的bean能集合到一个xml中,使用的时候只使用总的就可以了

五、C\P命名空间要先在xml中引入约束

 

xmlns:c="http://www.springframework.org/schema/c"

xmlns:p="http://www.springframework.org/schema/p"

P命名空间property 的缩写(简单的属性赋值可以使用):

C命名空间construct的缩写(有参、无参构造器赋值)

使用的时候再次强调,在类中要有对应的方法

六、作用域

<bean id="personDaoImpl" class="com.rzgsl.pojo.PersonDaoImpl" scope="singleton"></bean>
<bean id="userDaoImpl" class="com.rzgsl.pojo.UserDaoImpl" scope="prototype"></bean>

singleton默认是单例,一共只创建一个对象,单线程使用。

prototype原型模式,每次创建一个新对象,一般多线程使用。

request、session、application都是在web项目中才能使用,

七、Bean自动装配

1、在xml中显式装配(上面所列的xml配置bean就属于这种)

2、在java中显示装配

3、隐私的装配,在bean中ref引用,隐式的可以byType或byName,byType如果有两个类型一样id不同的bean,那么就会报错

<bean id="dog" class="com.rzgsl.pojo.Dog"></bean>
    <bean id="cat" class="com.rzgsl.pojo.Cat"></bean>
    <bean id="person" class="com.rzgsl.pojo.Person" autowire="byType">
        <property name="name" value="张三"></property>
    </bean>
</beans>

注意:类的shot方法,public void shot()和void shot()不同,后者不能被其他类调用。作用域的问题!!!

4、大部分情况下会使用注解开发,而不是使用xml

Autowired(spring注解)默认是根据byType自动装配,所以有多个类型的xml或者注解某个类的时候,会报错,这时候可以再添加@Qualifier注解,指定名称.这个是spring自带的,换框架的时候,要spring。用在类上,或用在类的方法上,不用写set方法也能用。常用

补充:xmlns:XML Namespace        xmlns表示默认的Namespace。

 xsi:schemaLocation属性其实是Namespace为http://www.w3.org/2001/XMLSchema-instance里的schemaLocation属性,正是因为我们一开始声明了

1、先再xml中添加约束,再开启<context:annotation-config/>

2、通过byName实现,如果一个类有多个不同名字的bean,那么可以@Autowired再加一个@Qualifiler

3、与Resource(java注解)相比,Resource默认是根据byName自动装配,这个是java自带的,换框架的时候,不需要spring,不成功,再通过byType。不常用

public class Person {
    @Autowired
    private Dog dog;
    @Autowired
    private Cat cat;
    private String name;

    public Dog getDog() {
        return dog;
    }

    public Cat getCat() {
        return cat;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "dog=" + dog +
                ", cat=" + cat +
                ", name='" + name + '\'' +
                '}';
    }
}

七、@Componet组件

1、bean.xml中开启 2、在类上面添加@Component注解

作用:用注解生成对象。不用在bean.xml中配置bean,生成对象了

@value 赋值……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值