ssm学习(二)

SSM学习(第二spring)

参考书资源下载

Spring中的Bean

1、Bean的配置

​ 元素的常用属性和子元素 。通常一个普通的只需要定义id(name)及class属性即可。若无id和name,class当id用

属性或子元素 名称说明
idBean的唯一标识符,Spring容器对Bean的配置、管理都通过该属性进行。
nameSpring容器通过此属性进行配置和管理,name属性可以为Bean指定多个名称,每个名称之间用逗号或分号隔开。
class指定Bean的实现类,它必须使用类的全限定名。
scope用于设定Bean实例的作用域,其属性值有:singleton(单例)、prototype(原型)、request、session、global Session、application和 websocket,默认值为singleton。
constructor-arg元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的index属性指定构造参数的序号(从0开始),type属性指定构造参数的类型,参数值可以通过ref属性或value属性直接指定,也可以通过ref或value子元素指定。
property元素的子元素,用于调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。访元素的name属性指定Bean实例中的相应属性名,ref属性或value属性用于指定参数值。
属性或子元素 名称说明
ref< constructor-arg >、< property >等元素的属性或子元素,可以用于指定对Bean工厂中某个Bean实例的引用。
value< constructor-arg >、< property >等元素的属性或子元素,可以用于直接给定一个常量值。
list用于封装List或数组属性的依赖注入。
set用于封装Set类型属性的依赖注入。
map用于封装Map类型属性的依赖注入。
entry元素的子元素,用于设置一个键值对。其key属性指定字符串类型的键值,ref属性或value属性直接指定其值,也可以通过ref或value子元素指定其值。

2、Bean的作用域

作用域名称说明
Singleton (单例)使用singleton定义的Bean在Spring容器中将只有一个实例,也就是说,无论有多少个Bean引用它,始终将指向同一个对象。这也是Spring容器默认的作用域。
Prototype (原型)每次通过Spring容器获取的prototype定义的Bean时,容器都将创建一个新的Bean实例。
request在一次HTTP请求中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Request内有效。
session在一次HTTP Session中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Session内有效。
globalSession在一个全局的HTTP Session中,容器会返回该Bean的同一个实例。仅在使用portlet上下文时有效。
application为每个ServletContext对象创建一个实例。仅在Web相关的ApplicationContext中有效。
websocket为每个websocket对象创建一个实例。仅在Web相关的ApplicationContext中生效。

常用的是Singleton(单例) 和Prototype(多例),如果不加,默认为Singleton。使用时将scope属性值进行修改。如:<bean id=”scope”class=”com.ssm.scope.Scope”scope=”singleton” />
*注:在使用 singleton时要增加spring-aop-4.3.6.RELEASE.jar依赖包 。

下面展示一些 prototype演示代码

	  <!-- 不写scope="singleton"默认也是单例 -->
      <!-- singleton单例 prototype原型,每次获取都穿件一个新的实例 -->
      在applicationContext.xml中加入
      <bean id="scope" class="com.ssm.scope.Scope" scope="prototype" />
//创建ScopeTest测试类
package com.ssm.scope;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ScopeTest {

	public static void main(String[] args) {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println(applicationContext.getBean("scope"));
		System.out.println(applicationContext.getBean("scope"));

	}

}

在这里插入图片描述

3、Bean的装配方式

bean依赖注入主要有三种:
1、基于XML的装配
1)设值注入
满足:①Bean类必须提供一个默认的无参构造方法②为需要的属性提供对应的setter()方法
设值注入配置文件中使用的是的子元素为每个属性注入值
2)构造注入
满足:提供所有参数的构造方法
构造注入配置文件中使用的是的子元素来定义构造方法的参数,value设置该参数的值。
下面展示一些 演示代码

// An highlighted block
package com.ssm.user;

import java.util.List;

public class User {
	private String uname;
	private String password;
	private List<String> list;
	//构造注入:带所有参数的构造方法
	public User(String uname, String password, List<String> list) {
		super();
		this.uname = uname;
		this.password = password;
		this.list = list;
	}
	@Override
	public String toString() {
		return "User [uname=" + uname + ", password=" + password + ", list=" + list + "]";
	}
	//设值注入:无参构造方法、提供setter方法
	public  User(){
		
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public void setList(List<String> list) {
		this.list = list;
	}	
}
在applicationContext.xml中添加
// applicationContext.xml
<!--构造注入-->
 <bean id="user1" class="com.ssm.user.User" >
      	<constructor-arg index="0" value="admin" />
      	<!--constructor-arg中的index表索引(从0,value表设置注入的值-->
      	<constructor-arg index="1" value="admin"  />
      	<constructor-arg index="2">
      	<!--list用于封装List属性的依赖注入-->
      		<list>
      			<value>"admin1"</value>
      			<value>"admin2"</value>
      		</list>
      	</constructor-arg>
      </bean>
<!--设值注入-->
       <bean id="user2" class="com.ssm.user.User" >
       	<property name="uname" value="admin1"></property>
       <property name="password" value="admin1"></property>
       <property name="list">
       		<list>
       			<value>"1"</value>
       			<value>"2"</value>
       		</list>
       </property>
       </bean>
// 测试类
package com.ssm.user;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserTest {

	public static void main(String[] args) {
		ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println(app.getBean("user1"));
		System.out.println(app.getBean("user2"));

	}

}
三月 18, 2022 8:53:48 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@176fe71: startup date [Fri Mar 18 20:53:48 CST 2022]; root of context hierarchy
三月 18, 2022 8:53:48 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
User [uname=admin, password=admin, list=["admin1", "admin2"]]
User [uname=admin1, password=admin1, list=["1", "2"]]

2、基于Annotation(注解)的装配(通过注解实现)

注解名称说明
@Component可以使用此注解描述Spring中的Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用的任何层次。使用时只需将该注解标注在相应类上即可。
@Repository用于将数据访问层(DAO层)的类标识为Spring中的Bean,其功能与@Component相同。
@Service通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。
@Controller通常作用在控制层(如Spring MVC的Controller),用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。
@Autowired用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配。
@Resource其作用与@Autowired一样。其区别在于@Autowired默认按Bean类型装配,而@Resource默认按照Bean实例名称进行装配。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。如果指定name属性,则按实例名称进行装配;如果指定type属性,则按Bean类型进行装配;如果都不指定,则先按Bean实例名称装配,如果不能匹配,再按照Bean类型进行装配;如果都无法匹配,则抛出NoSuchBeanDefinitionException异常。
@Qualifier与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

注:在上表几个注解中,虽然与@Repository、@Service和@Controller功能与@Component注解的功能相同,但为了使标注类本身用途更加清晰,建议在实际开发中使用@Repository、@Service和@Controller分别对实现类进行标注。

UserDao接口

public interface UserDao {
	public void save();
}

UserDaoImpl类

import org.springframework.stereotype.Repository;

@Repository("userDao")
public class UserDaoImpl implements UserDao {

	@Override
	public void save() {
		// TODO Auto-generated method stub
		System.out.println("userDao");
	}

}

UserService

public interface UserService {
	public void save();
}

UserServiceImpl

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl implements UserService{

	@Resource(name="userDao")
	private UserDao userDao;
	@Override
	public void save() {
		this.userDao.save();
		System.out.println("userService");
	}
}

在bean1.xml上新增

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">

bean1.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:context="http://www.springframework.org/schema/context"     
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        		http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        		http://www.springframework.org/schema/context
     			http://www.springframework.org/schema/context/spring-context-4.3.xsd">
      <context:annotation-config />
      <bean id="userDao" class="com.ssm.annotation.UserDaoImpl"/>
      <bean id="userService" class="com.ssm.annotation.UserServiceImpl" />
      <bean id="userController" class="com.ssm.annotation.UserController"/>
</beans>

总布局
在这里插入图片描述
在这里插入图片描述
3、自动装配

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点份炸鸡778

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值