目录
2.练习教材P248-249的setter注入和构造器注入。
1.Spring环境配置
(1)Spring IOC/DI
最终运行结果如下:
各个文件的基本代码如下:
Category.java
package pojo;
// 用于演示IOC和DI
public class Category {
public int getID(){
return id;
}
public void setID(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
private int id;
private String name;
}
TestSpring.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.Category;
public class TestSpring {
// 加载配置文件
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
// 调用配置文件的name=c的bean
Category c = (Category) context.getBean("c");
// 输出获取的name值
System.out.println(c.getName());
}
}
applicationContext.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean name="c" class="pojo.Category">
<property name="name" value="category 1" />
</bean>
</beans>
<!-- Spring的核心配置文件,通过关键字c即可获得Category对象(class的值为Category类所在的路径),获取该对象时,即被注入字符串“category 1”到name属性中 -->
自我理解的原理:
spring框架相对于传统的方式而言,将为开发者省略了创建对象的工作,创建对象的工作交由xml文件之中,在测试类中,只需要加载相关的配置文件:
在然后调用配置文件中的对应bean即可:
(2)注入对象
运行结果如下:
注入对象工作也是在xml文件中完成的,但是被注入对象的类中应该创建注入对象,本次作业中
被注入被注入对象的类为:Product.java
注入注入的对象所在的类为:Category.java
具体操作如下:
接下了就在xml文件汇中进行注入对象的操作:
指定了 Product 对象的 category 属性。name 属性表示属性名,ref属性则引用了之前定义的 name为 "c" 的 bean 对象,即 Category 类型的对象 c。
这相当于将 Category 对象 c 设置到 Product 对象的 category 属性中,完成两个对象之间的依赖注入。
新增(修改)的各部分具体代码如下:
Product.java
package pojo;
public class Product {
private int id;
private String name;
private Category category;
public int getID(){
return id;
}
public void setID(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public Category getCategory(){
return category;
}
public void setCategory(Category category){
this.category=category;
}
}
applicationContext.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean name="c" class="pojo.Category">
<property name="name" value="category 1" />
</bean>
<!-- Spring的核心配置文件,通过关键字c即可获得Category对象(class的值为Category类所在的路径),获取该对象时,即被注入字符串“category 1”到name属性中 -->
<bean name="p" class="pojo.Product">
<property name="name" value="product1"/>
<property name="category" ref="c"/>
</bean>
<!-- 指定了 Product 对象的 category 属性。name 属性表示属性名,ref属性则引用了之前定义的 name为 "c" 的 bean 对象,即 Category 类型的对象 c。
这相当于将 Category 对象 c 设置到 Product 对象的 category 属性中,完成两个对象之间的依赖注入。 -->
</beans>
TestSpring.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//import pojo.Category;
import pojo.Product;
public class TestSpring {
public static void main(String[] args) {
// 加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
// // 调用配置文件的name=c的bean
// Category c = (Category) context.getBean("c");
// // 输出获取的name值
// System.out.println(c.getName());
Product p = (Product)context.getBean("p");
System.out.println(p.getName());
System.out.println(p.getCategory().getName());
}
}
(3)Spring注解方式 IOC/DI
本次将演示如何使用注释方法完成注入对象的效果
使用@Autowired
使用注解方式时要在xml文文件中加入<context:annotation-config/>语句,如下图:
在Product.java的category属性前加入@Autowired,需要导入相应的依赖包
( @Autowired其位置可以放在属性声明语句前(即直接放在属性前)、setter 方法上或构造方法上。)
setter方法上
运行结果如下:
使用@Resource
在被注解对象的类中加入@Resource语句,即可完成对象的注入,如下图在被注解对象的Product类中加入@Resource语句(需要导入相关的依赖包):
使用名称为 "c" 的 Bean 进行对 category 属性的注入。
xml文件的配置与使用@Autowired一致
上述例子都是对注入对象行为的注解
对Bean的注解
修改applicationContext.xml文件,用
<context:component-scan base-package="pojo"/>
//这段代码表示使用 Spring 的组件扫描功能,用于自动注册被 Spring 托管的 Bean。其中,base-package 属性指定了需要扫描的包路径(即 pojo 包及其子包),Spring 会自动扫描该路径下所有带有 @Component 及其派生注解(如@Service、@Repository、@Controller 等)的类,并将其所生成的实例注册并管理起来。这样,在需要使用这些实例时,我们只需在其他类中声明对应类型的依赖,Spring 就会自动将其注入。在基于注解的 Spring 配置中,通常都会结合 @Autowired 或 @Resource 等注解一起使用,以实现依赖注入和控制反转等功能。//
语句替换所有
具体代码如下:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="pojo"/>
</beans>
为pojo包下(与设置扫描包的范围相对应)相应的类添加@Component (注意导入相应的依赖包)注解,表明此类使bean。
Product.java
package pojo;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("p")
public class Product {
private int id;
private String name="product 1";
@Autowired
private Category category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
Category.java
package pojo;
import org.springframework.stereotype.Component;
@Component("c")
public class Category {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int id;
private String name="category 1";
}
由于applicationContext.xml文件中没有对Product类和Category进行配置,所以要在类自主完成配置:
TestSpring.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.Product;
public class TestSpring {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
Product p = (Product) context.getBean("p");
System.out.println(p.getName());
System.out.println(p.getCategory().getName());
}
}
运行结果如下:
2.练习教材P248-249的setter注入和构造器注入。
创建用户的JavaBean,具体代码如下:
User.java
package pojo;
public class User {
private String name;
private Integer age;
private String sex;
private Integer id;
// 设置setter和getter方法
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(Integer age){
this.age=age;
}
public Integer getAge(){
return age;
}
public void setSex(String sex){
this.sex=sex;
}
public String getSex(){
return sex;
}
public void setID(Integer id){
this.id=id;
}
public Integer getID(){
return id;
}
}
在applicationContext.xml文件中配置JavaBean,具体代码如下:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="user" class="pojo.User">
<property name="name">
<value>法老爷爷(孙权)</value>
</property>
<property name="age">
<value>31</value>
</property>
<property name="sex">
<value>男</value>
</property>
</bean>
</beans>
测试类代码如下:
TestUser.java
package test;
import pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestUser {
public static void main(String args[]){
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
User user =(User)factory.getBean("user");
System.out.println("用户姓名:"+user.getName());
System.out.println("用户年龄:"+user.getAge());
System.out.println("用户性别:"+user.getSex());
}
}
运行结果如下:
(尝试在xml文件中使用注解模式)
3.练习教材P259-261的DAO模式
定义实体类对象User.java,具体代码如下:(使用的还是上一个任务中创建的java类)
package pojo;
public class User {
private String name;
private Integer age;
private String sex;
private Integer id;
// 设置setter和getter方法
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(Integer age){
this.age=age;
}
public Integer getAge(){
return age;
}
public void setSex(String sex){
this.sex=sex;
}
public String getSex(){
return sex;
}
public void setID(Integer id){
this.id=id;
}
public Integer getID(){
return id;
}
}
创建接口UserDAOImpl,并且在接口中定义用来执行添加数据的insert()方法,该方法使用的参数时实体类User的对象。
具体代码如下:
package pojo;
public interface UserDAOImpl {
public void inserUser(User user);// 添加用户信息的方法
}
编写实现上述接口的实体类UseDAO类:具体代码含义都有注释
具体代码如下:
package DAO;
import pojo.UserDAOImpl;
import pojo.User;
import java.sql.SQLException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;
public class UserDAO implements UserDAOImpl {
private DataSource dataSource;//注入dataSource,在xml文件中进行配置,与数据建立练习
public DataSource getDataSource(){
return dataSource;
}
public void setDataSource(DataSource dataSource){
this.dataSource=dataSource;
}
// 重写接口中的方法
// 获取设置的数据
// 向数据数据表中tb_user中添加数据
public void inserUser(User user){
String name = user.getName();
Integer age = user.getAge();
String sex = user.getSex();
Connection conn = null;
Statement stmt = null;// 用于执行sql语句
System.out.println(name);
System.out.println(age);
System.out.println(sex);
try{
conn = dataSource.getConnection();//获取数据库连接
stmt = conn.createStatement();
stmt.execute("INSERT INTO tb_user(name,age,sex) VALUES('" + name + "', " + age + ", '" + sex + "')");
}catch(SQLException e){
e.printStackTrace();
}
}
}
编写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" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/how2java?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="UserDao" class="DAO.UserDAO">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
编写测试类;
具体代码如下:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import DAO.UserDAO;
import pojo.User;
public class TestUserDAO {
public static void main(String args[]){
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = new User();
user.setName("法老爷爷孙权");
user.setAge(31);
user.setSex("男");
UserDAO userDAO = (UserDAO)factory.getBean("UserDao");
userDAO.inserUser(user);
System.out.println("数据添加成功");
}
}
第一次运行时,出现了字符集出现了问题,感谢gpt(感谢同学提供的gpt链接)
进行修改之后,具体运行结果如下:
我添加了几条打印输出语句
4.练习教材P265的JDBC Temple操作数据库
在xml配置文件中配置JDBC Temple和数据源
具体代码如下:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="user" class="pojo.User">
<property name="name">
<value>法老爷爷(孙权)</value>
</property>
<property name="age">
<value>31</value>
</property>
<property name="sex">
<value>男</value>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/how2java?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="UserDao" class="DAO.UserDAO">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置JDBC Template -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
创建测试类,具体代码如下:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class AddUsers {
public static void main (String args[]){
DriverManagerDataSource ds = null;
JdbcTemplate jtl =null;
// 获取配置文件
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
jtl = (JdbcTemplate)factory.getBean("jdbcTemplate");
String sql = "insert into tb_user(name,age,sex)values('黄科茗','20','男')";
jtl.update(sql);
System.out.println("更新成功");
}
}
具体运行结果如下:
查看数据库数是否成功更新:
成功
5.Spring+Mybatis
跟着教程来,没有搞太清楚,不知道应该运行哪一个文件