Java学习路线-56:Spring与Ioc
发布日期:2021-07-01 06:11:31 浏览次数:2 分类:技术文章

本文共 10927 字,大约阅读时间需要 36 分钟。

Spring

官网:

理念:使现有技术更加实用,本身是大杂烩整合现有的框架技术

优点:

  1. 轻量级框架
  2. Ioc 容器-控制反转 inversion of Control
  3. Aop 面向切面编程
  4. 对事务支持
  5. 对框架的支持

一、Ioc 控制反转

Ioc 是一种编程思想,由主动编程变为被动接收

别名:依赖注入 dependency injection

控制:

指谁来控制对象的创建
传统的应用程序对象的创建是由程序本身控制的
使用 spring 之后,由 spring 创建对象

反转:

正转指程序来创建对象
反转指程序本身不创建对象,而变成被动接受对象

总结:

以前对象是由程序本身创建,
使用 spring 之后,程序变为接收 spring 创建好的对象

简单示例

1、依赖 pom.xml

org.springframework
spring-context-support
5.2.6.RELEASE
org.springframework
spring-context
5.2.6.RELEASE

2、Person.java

package com.pengshiyu.bean;public class Person {
private String name; public void setName(String name) {
this.name = name; } public void sayHello() {
System.out.println("hello " + this.name); }}

3、beans.xml

此处是完整写法,之后将采用简写形式

4、Demo.java

package com.pengshiyu.spring;import com.pengshiyu.bean.Person;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Demo {
public static void main(String[] args) {
// 解析beans.xml 文件,生成对应的Bean对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person)context.getBean("person"); person.sayHello(); }}

二、Dao 管理示例

Ioc: 对象由 spring 来创建

1、UserDao

package com.spring.dao;public interface UserDao {
public void getUser();}

2、UserDaoMysqlImpl

package com.spring.dao.impl;import com.spring.dao.UserDao;public class UserDaoMysqlImpl implements UserDao {
@Override public void getUser() {
System.out.println("Mysql 获取用户信息"); }}

3、UserDaoOracleImpl

package com.spring.dao.impl;import com.spring.dao.UserDao;public class UserDaoOracleImpl implements UserDao {
@Override public void getUser() {
System.out.println("Oracle 获取用户信息"); }}

4、UserService

package com.spring.service;public interface UserService {
public void getUser();}

5、UserServiceImpl

package com.spring.service.impl;import com.spring.dao.UserDao;import com.spring.service.UserService;public class UserServiceImpl implements UserService {
private UserDao userDao = null; public void setUserDao(UserDao userDao) {
this.userDao = userDao; } @Override public void getUser() {
this.userDao.getUser(); }}

6、beans.xml(简化版)

7、TestDemo

package com.spring.test;import com.spring.service.UserService;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestDemo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserService service = (UserService)context.getBean("service"); service.getUser(); }}

三、使用 Ioc 来创建对象的 3 种方法

Person 类

package com.pengshiyu.bean;public class Person {
private String name; public Person() {
} public Person(String name) {
this.name = name; } public void sayHello() {
System.out.println("hello " + this.name); }}

创建对象

package com.spring.test;import com.pengshiyu.bean.Person;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Demo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person) context.getBean("person"); person.sayHello(); }}

beans.xml(简化版)

1、无参构造

2、有参构造

(1)根据参数下标设置

(2)根据参数名称设置

(3)根据参数类型设置

3、工厂方法创建

(1)静态工厂

package com.pengshiyu.factory;import com.pengshiyu.bean.Person;public class PersonFactory {
public static Person newInstance(String name) {
return new Person(name); }}

(2)动态工厂

package com.pengshiyu.factory;import com.pengshiyu.bean.Person;public class PersonFactory {
public Person newInstance(String name) {
return new Person(name); }}

注意静态工厂 static

四、Spring 配置文件

id 是 bean 的唯一标识符,如果没有配置 id,name 默认为标识符

如果配置了 id,又配置了 name,则 name 是别名

name 可以设置多个别名分隔符可以是空格、逗号、分号

class 是 bean 的全限定名=包名+类名

如果不配置 id 和 name,那么可以可以使用如下方式获取对象

applicationContext.getBean(class)

配置如下

获取方式

Person person = (Person) context.getBean("person1");// 或者Person person = (Person) context.getBean("user");// 或者Person person = (Person) context.getBean(Person.class);

导入文件

五、Spring 依赖注入 DI

dependency injection

依赖:指 bean 对象创建依赖于容器,bean 对象的依赖资源

注入:指 bean 对象依赖的资源由容器来设置和装配

spring 注入

测试

package com.spring.test;import com.pengshiyu.bean.Person;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Demo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person) context.getBean("person"); person.sayHello(); }}
  1. 构造器注入
package com.pengshiyu.bean;public class Person {
private String name; public Person(String name) {
this.name = name; } public void sayHello() {
System.out.println("hello " + this.name); }}
  1. setter 注入

(1)常量注入

package com.pengshiyu.bean;public class Person {
private String name; public void setName(String name) {
this.name = name; } public void sayHello() {
System.out.println("hello " + this.name); }}

(2)bean 注入

package com.pengshiyu.bean;public class Address {
private String address; public void setAddress(String address) {
this.address = address; } public String getAddress() {
return address; }}
package com.pengshiyu.bean;public class Person {
private String name; private Address address; public void setAddress(Address address) {
this.address = address; } public void setName(String name) {
this.name = name; } public void sayHello() {
System.out.println("hello " + this.name + this.address.getAddress()); }}

(3)数组注入

package com.pengshiyu.bean;public class Book {
private String name; public Book(String name){
this.name = name; } @Override public String toString() {
return "《" + this.name + "》"; }}
package com.pengshiyu.bean;import java.util.Arrays;public class Person {
private Book[] books; public void setBooks(Book[] books) {
this.books = books; } @Override public String toString() {
return "Person{" + "books=" + Arrays.toString(books) + '}'; }}
水浒传
红楼梦
三国演义
西游记

(4)List 注入

package com.pengshiyu.bean;import java.util.Arrays;import java.util.List;public class Person {
private List
[] books; public void setBooks(List
[] books) {
this.books = books; } @Override public String toString() {
return "Person{" + "books=" + Arrays.toString(books) + '}'; }}
水浒传
红楼梦
三国演义
西游记

(5)Map 注入

package com.pengshiyu.bean;import java.util.Map;public class Person {
private Map
cards; public void setCards(Map
cards) {
this.cards = cards; } @Override public String toString() {
return cards.toString(); }}

(6)Set 注入

package com.pengshiyu.bean;import java.util.Set;public class Person {
private Set
games; public void setGames(Set
games) {
this.games = games; } @Override public String toString() {
return games.toString(); }}
英雄联盟
王者荣耀

(7)null 注入

package com.pengshiyu.bean;public class Person {
public void setWife(String wife) {
this.wife = wife; } private String wife; @Override public String toString() {
return wife; }}

(8) Properties 注入

package com.pengshiyu.bean;import java.util.Properties;public class Person {
private Properties props; public void setProps(Properties props) {
this.props = props; } @Override public String toString() {
return this.props.toString(); }}
Tom
Man

(9) p 命名空间注入

需要有对应的 set 方法

package com.pengshiyu.bean;public class Person {
private String name; private int age; public void setName(String name) {
this.name = name; } public void setAge(int age) {
this.age = age; } @Override public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}

头文件需要引入

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

(10)c 命名空间注入

要求有对应的构造方法

package com.pengshiyu.bean;public class Person {
private String name; private int age; public Person(String name, int age) {
this.name = name; this.age = age; } @Override public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}

头文件需要引入

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

六、bean 的作用域

spring

桥梁轻量级易学ioc diapp事务整合框架

scope:

  1. singleton 单例 整个容器只有一个对象实例(默认)
  2. prototype 原型 每次获取 Bean 都产生一个新对象
  3. request 每次请求时创建一个新的对象
  4. session 会话范围内有一个对象
  5. global session 只在 portlet 下有用,表示 applicatio
  6. application 在应用范围中有一个对象

Bean 自动装配

autowire

  1. byName
  2. byType
  3. constructor

不推荐使用自动装配

转载地址:https://pengshiyu.blog.csdn.net/article/details/106889147 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java学习路线-57:静态代理和动态代理
下一篇:Java学习路线-55:自定义JSP标签

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月25日 11时00分20秒