Spring 02 -Spring依赖注入+Spring注解开发

spring依赖注入与注解开发

  • 1 依赖注入(DI)
    • 1.1 set方法注入
    • 1.2 构造方法注入
    • 1.3 复杂类型注入
    • 1.4 自定义类型的注入
  • 2 依赖注入案例
  • 3 Spring注解开发
    • 3.1 **开启注解扫描**
    • 3.2 Component 注解
    • 3.3 Autowired注解 (开发常用 )
    • 3.4 Resource注解

1 依赖注入(DI)

依赖注入:在Spring创建对象的同时,为其属性赋值,称之为依赖注入。

1.1 set方法注入

创建对象时,Spring工厂会通过Set方法为对象的属性赋值。

范例:定义一个Bean类型

public class User {
    private String name;
    private int age;
    private double money;
    private String hobby;
    private Date birthday;
    //省略set、get方法、构造方法
}

属性注入


<bean id="user" class="com.ying.pojo.User">
    
    <property name="name" value="张三"/>
    <property name="age" value="10"/>
    <property name="hobby" value="打篮球"/>
    <property name="money" value="200.22"/>
    
    <property name="birthday" ref="date"/>
bean>
<bean id="date" class="java.util.Date">
    <property name="year" value="122"/>
bean>

1.2 构造方法注入

范例:定义一个Bean类型 提供构造方法

public class User {
    private String name;
    private int age;
    private double money;
    private String hobby;
    private Date birthday;
    //省略set、get方法、构造方法
}

构造方法注入


<bean id="user1" class="com.ying.pojo.User">
    
    
    
    
    
    
    
    
    
    
    
    
    
    <constructor-arg index="0" value="赵六"/>
    <constructor-arg index="1" value="60"/>
    <constructor-arg index="2" value="444.44"/>
    <constructor-arg index="3" value="rap"/>
    <constructor-arg index="4" ref="date"/>
bean>

1.3 复杂类型注入

复杂类型指的是:list、set、map、array、properties等类型

定义复杂Bean类型

public class Person {
    private List<User> userList;
    private Map<String,String> map;
    private Set<String> set;
    private String[] arr;
    private Properties properties;
    //省略set、get方法、构造方法
}

给复杂类型注入属性值

<bean id="person" class="com.ying.pojo.Person">
    <property name="userList">
        <list>
            <bean class="com.ying.pojo.User">bean>
            <bean class="com.ying.pojo.User">bean>
            <bean class="com.ying.pojo.User">bean>
        list>
    property>
    <property name="set">
        <set>
            <value>1value>
            <value>2value>
            <value>3value>
        set>
    property>
    <property name="arr">
        <array>
            <value>avalue>
            <value>bvalue>
            <value>cvalue>
        array>
    property>
    <property name="map">
        <map>
            <entry key="k1" value="v1">entry>
            <entry key="k2" value="v2">entry>
            <entry key="k3" value="v3">entry>
        map>
    property>
    <property name="properties">
        <props>
            <prop key="driver">com.mysql.jdbc.Dirverprop>
            <prop key="url">jdbc:mysql:///java2101prop>
        props>
    property>
bean>

1.4 自定义类型的注入

范例:在UserServiceImpl中注入UserDaoImpl类型的属性

public class UserServiceImpl {
    private UserDaoImpl userDao;
    public void setUserDao(UserDaoImpl userDao) {
        this.userDao = userDao;
    }

    public void addUser(){
        userDao.addUser();
    }
}



<bean id="userDao" class="com.ying.dao.UserDaoImpl">bean>

<bean id="userService" class="com.ying.service.UserServiceImpl">
    <property name="userDao" ref="userDao">property>
bean>

2 依赖注入案例


Spring整合DBUtils实现JDBC开发

EmpServiceImpl

public class EmpServiceImpl {
    private EmpDaoImpl empDao;

    public void setEmpDao(EmpDaoImpl empDao) {
        this.empDao = empDao;
    }

    public List<Emp> getAll(){
        try {
            return empDao.getAll();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
}

EmpDaoImpl

public class EmpDaoImpl {
    private QueryRunner queryRunner;

    public EmpDaoImpl(QueryRunner queryRunner) {
        this.queryRunner = queryRunner;
    }

    public List<Emp> getAll() throws SQLException {
        return queryRunner.query("select * from emp ",new BeanListHandler<Emp>(Emp.class));
    }
}

依赖注入配置



<bean id="empService" class="com.ying.service.EmpServiceImpl">
    <property name="empDao" ref="empDao"/>
bean>

<bean id="empDao" class="com.ying.dao.EmpDaoImpl">
    <constructor-arg name="queryRunner" ref="queryRunner">constructor-arg>
bean>

<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
    <constructor-arg name="ds" ref="dataSource"/>
bean>

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql:///java2101"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    
    
    
    
bean>

测试

@Test
public void test05(){
    //创建Spring容器对象
    ApplicationContext ac =
        new ClassPathXmlApplicationContext("applicationContext.xml");
    EmpServiceImpl empService = ac.getBean("empService", EmpServiceImpl.class);
    List<Emp> empList = empService.getAll();
    empList.stream().forEach(System.out::println);
}

3 Spring注解开发

3.1 开启注解扫描


<context:component-scan base-package="com.ying"/>

3.2 Component 注解

用于替换自建类型组件的 标签;可以更快速的声明bean

@Component 注解的含义:创建类的对象,相当于xml中配置的bean标签

  • @Controller 针对于控制器层的类的注解
  • @Service 针对于业务层的类的注解
  • @Repository 针对持久层的类的注解 Dao数据访问层
@Component
//@Service("empService")
//@Controller("empService")
//@Repository("empService")
public class EmpServiceImpl implements EmpService{ 
}

3.3 Autowired注解 (开发常用 )

主要用于属性注入,Spring

  • @Autowired 自动装配:将对象属性自动进行注入(类型注入)

  • @Qualifier(“empDaoImpl1”) 限定要自动注入的bean的id,一般和@Autowired联用

注意:@Autowired先会按照类型注入,如果这个类有多个实例,那么再按照名称注入,如果有多个实例那么需要使用Qualifier进行指定

@Component
public class EmpServiceImpl implements EmpService{
    @Autowired
    @Qualifier("empDaoImpl1")
    //@Resource(name="empDaoImpl2")
    private EmpDao empDao;
    public void addEmp(){
        empDao.addEmp();
    }
}

3.4 Resource注解

主要用于属性注入,jdk

@Resource 自动装配:将对象属性自动进行注入(名称注入)

注意:默认按照名称进行装配,如果找到指定的名称则直接注入。如果没有找到,那么再按类型称注入,如果有多个实例那么需要使用name属性进行指定

@Component//@Controller   @Service  @Repository 
public class EmpServiceImpl implements EmpService{
    @Resource(name="empDaoImpl2")
    private EmpDao empDao;

    public void addEmp(){
        empDao.addEmp();
    }
}

你可能感兴趣的:(#,框架演进,Java,spring,java,mysql)