SSM[spring] 基于注解的IOC使用

注解模式注意点

  • xml文件的头信息和引用类的方式有区别
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <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:component-scan base-package="com.gphper"></context:component-scan>
    </beans>
  • 注解的使用方式和基于xml的使用方式是可以混合使用的

<bean> 标签的替代注解 Component

  • 不取名字时,默认设置为 首字母小写的类的名称
  • 还有三个平替注解 Controller 表现层 Service 业务层 Repository 持久层 效果及使用和 Component 注解一样

注入数据标签

  • Autowired 自动按照类型注入,如果IOC中有多个相同类型的对象时,会按照成员变量的名称寻找。可以配合 Qualifier 注解指定多个相同类型对象中的对象id
  • Resource 注解 直接指定id注入指定的成员中
  • 以上标签只能注入 bean 类型的数据,基本类型和String类型的不能使用,注解不支持集合类型的数据注入只能使用xml格式的写法
  • Value 注解作用于基本类型和String类型,且支持SpEl表达式 ${表达式}

范围注解

  • Scope 注解,设置类的作用范围,常用的单例和多例 singleton prototype

生命周期相关注解

  • PreDestory 相当于 destory-method 属性 PostConstruct 相当于 init-method
[com.gphper.service.imp.AccountServiceImpl]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.gphper.service.imp;

import com.gphper.dao.IAccountDao;
import com.gphper.service.IAccountService;
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.Component;

import javax.annotation.Resource;

@Component
public class AccountServiceImpl implements IAccountService {

// @Autowired
// @Qualifier("accountDao")
@Resource(name = "accountDao")
private IAccountDao account;

@Value("gphper")
private String username;

@Override
public void saveAccount() {
account.saveAccount();
}

@Override
public String toString() {
return "AccountServiceImpl{" +
"username='" + username + '\'' +
'}';
}
}
[package com.gphper.dao.impl.AccountDao]
1
2
3
4
5
6
7
8
9
10
11
package com.gphper.dao.impl;

import com.gphper.dao.IAccountDao;
import org.springframework.stereotype.Repository;

@Repository
public class AccountDao implements IAccountDao {
public void saveAccount(){
System.out.println("保存成功");
}
}

完全去除xml

  • Configuration 声明配置类
  • ComponentScan 配置Bean加载包的路径
  • Bean 将方法的返回值注入到IOC容器中
  • Import 在注解类中引入其他注解
  • PropertySource 指定properties配置文件
1
2
3
4
5
6
7
<bean id="stat" factory-bean="conn" factory-method="createStatement"></bean>

<bean id="conn" class="java.sql.DriverManager" factory-method="getConnection">
<constructor-arg name="url" value="jdbc:mysql://localhost:3306/book?useSSL=false"></constructor-arg>
<constructor-arg name="user" value="root"></constructor-arg>
<constructor-arg name="password" value="123456"></constructor-arg>
</bean>
[配置文件类]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.gphper.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

@Configuration
@ComponentScan("com.gphper")
@PropertySource("jdbc.properties") // 指定properties文件
public class SpringConfig {

@Value("${jdbc.url}")
private String url;
@Value("${jdbc.user}")
private String user;
@Value("${jdbc.password}")
private String password;

@Bean("conn")
public Connection getConn() throws SQLException {
Connection conn = DriverManager.getConnection(url,user,password);
return conn;
}

@Bean("stat")
public Statement getStat(Connection conn) throws SQLException {
Statement stat = conn.createStatement();
return stat;
}

}
1
2
3
// ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
// 替换主程序实现类
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);