脚本宝典收集整理的这篇文章主要介绍了Spring系列-SpringBase+IOC,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
定义?思想(重点)?
干啥的?作用于哪一方面?
基本配置,基本操作?
Spring 一个开源的免费的框架(容器)
Spring 一个轻量级的,非入侵式的框架。
控制反转(IOC),面向切面编程(AOP)
支持事务处理,对框架整合的支持。
总:spring 就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架
SpringBoot
SpringCloud
现在大多数公司都在使用SpringBoot进行快速开发
1.UserDAO 接口
2.UserDaoImpl 实现类
3.UserService 业务接口
4.UserServiceimpl 业务实现类
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码! 如果程序代码量特别大,修改一次的成本就会特别昂贵
我们使用set接口实现,已经发生了革命性的变化
// 程序主动创建对象,每次换东西都得这改
private UserDao userDao1 = new UserDaoImpl(); // 调用时:::每次都得换
private UserDao userDao1 = new UserDaoMySQLImpl(); // 调用时:::每次都得换
// 程序被动创建,控制权封装为一个方法,由使用者调用方法进行
private UserDao userDao; // Like-a
// 使用set进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
想不通的可以想想设置(手机等等)----根据自己的喜好设置一些功能,控制权在使用者的手上,,,没有设置功能的就是程序主动性的创建对象
说到底,目的是为了提高了用户的体验,用户可以依据自己的喜好来,而不是按照装好的东西来使用
这种思想,从本质上解决了问题,我们程序员不用去管理对象的创建了,而是提供一个方法(遥控器),系统耦合性大大降低。 可以更加的专注于业务上!---这是IOC原型
控制反转IOC(Inversion of Control) DI(依赖注入)是实现IOC的一种方法。
采用xml方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以将两者结合在一体,Bean的定义信息直接以注解的形式定义在实现类中, 从而达到了零配置的目的
1.mavern管理
2.导入Spring包就可以了
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dePEndency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
三个Bean要用的标签
<!--
id :bean的唯一标识符
class bean对象的全限定名:包名+类型
name:别名,而且name更高级,可以取多个别名,使用空格,逗号等等都可以区分
-->
<bean id = "userT" class="com.zjz.pojo.UserT" name="userT2,userT3">
<property name="name" value="zjz"/>
</bean>
2.别名
推荐使用bean里的name
<!--
id :bean的唯一标识符
class bean对象的全限定名:包名+类型
name:别名,而且name更高级,可以取多个别名,使用空格,逗号等等都可以区分
-->
<bean id = "userT" class="com.zjz.pojo.UserT" name="userT2,userT3">
<!--如果添加了别名,我们也可以通过别名获取到这个对象-->
<alias name="user" alias="adafaDFafadf"/>
3.import
假设,现在项目组有多个人开发,这三人负责不同的类,不同的类需要注册在不同的bean,我们可以利用import将所有人的beans.xml合并为一个总的
使用的时候,直接使用总的配置就好了
1.pojo
public class Hello {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@override
public String toString() {
return "Hello{" +
"str='" + str + ''' +
'}';
}
}
2.beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--使用Spring来创建对象,在Spring这些都称为Bean-->
<!--bean就是java对象 , 由Spring创建和管理-->
<!--
类型 变量名 = new 类型();
before: Hello hello = new Hello();
now : id = 变量名 class = new 的对象; property 相当于给对象的属性set值
-->
<!--如果要使用其它对象的属性时:
第一,要有本类调用其它类时的定义: private UserDao userDao; // Like-a
第二:配置 --- <property name="userDao" ref="userDaoImpl"/>
property中
ref :引用spring 容器创建好的对象
value: 具体的值,基本的数据类型
-->
<bean id="hello" class="com.zjz.pojo.Hello">
<property name="str" value="Spring"/>
</bean>
</beans>
3.Mytest
public class MyTest {
public static void main(String[] args) {
// 获取Spring的上下文对象!
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 我们的对象,现在都在spring中管理,我们要使用,直接从里面取出来就行
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
}
}
怎么引用其它对象??---目前手动的--
使用ref 首先得把ref要用到的Bean注册上!!要不报错
注:定义,声明都还是在类中进行,IOC它负责的只是创对象
<bean id="userDaoImpl" class="com.zjz.dao.UserDaoImpl">
<bean id="userServiceImpl" class="com.zjz.service.UserServiceImpl">
<!--ref :引用spring 容器创建好的对象
value: 具体的值,基本的数据类型
-->
<property name="userDao" ref="userDaoImpl"/>
// 它的功能就将其它类的属性||对象||其它--给引入到本类中
</bean>
private UserDao userDao; // Like-a
Hello 对象是谁创建的 ?
Hello 对象的属性是怎么设置的 ?
这个过程就叫控制反转 :
控制 : 谁来控制对象的创建, 传统应用程序的对象是由程序本身控制创建的, 使用Spring后, 对象是由Spring来创建的
反转 : 程序本身不创建对象, 而变成被动的接收对象 .
依赖注入 : 就是利用set方法来进行注入的.
IOC是一种编程思想,由主动的编程变成被动的接收
我们不需要去程序中去改动了,要实现不同的操作,只需要在xml中配置文件进行修改,所谓IOC, 一句话搞定:对象由Spring来创建,管理,装配
同java一样啊,构造器造对象
构造器注入
1.使用无参构建对象,默认
2.假设要使用有参构造创建对象 - 此时对象是有属性的对象
1.下标赋值
<!-- 第一种,下标赋值-->
<!--注意是构造器参数种的下标-->
<bean id="user" class="com.zjz.pojo.User">
<constructor-arg index="0" value="zjzHHH"/>
</bean>
2.类型赋值
<!-- 第一种,下标赋值-->
<!--
<bean id="user" class="com.zjz.pojo.User">
<constructor-arg index="0" value="zjzHHH"/>
</bean>
-->
<!--第二种,通过类型创建,两个方法都是Sting就不行了,不建议使用!-->
<!--
<bean id="user" class="com.zjz.pojo.User">
<constructor-arg type="java.lang.String" value="zjz"></constructor-arg>
</bean>
-->
3.参数名-- 重点,使用
<!--第三种,直接通过参数名来设置-->
<bean id="user" class="com.zjz.pojo.User">
<constructor-arg name="name" value="zjz"/>
</bean>
总结
依赖注入 - 依赖:bean对象的创建依赖于容器! 注入:bean对象的所有属性,由容器来注入!
说到底,对象的赋值,由容器来进行!
五.1.构造器注入--
<!--使用Spring来创建对象,在Spring这些都称为Bean-->
<!--bean就是java对象 , 由Spring创建和管理-->
<!--
类型 变量名 = new 类型();
before: Hello hello = new Hello();
now : id = 变量名 class = new 的对象; property 相当于给对象的属性set值
-->
// 无参的
<bean id="user" class="com.zjz.pojo.User"/>
// 有参的
<!--第三种,直接通过参数名来设置-->
<bean id="user" class="com.zjz.pojo.User">
<constructor-arg name="name" value="zjz"/>
</bean>
五.2.set注入(重要)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="address" class="com.zjz.pojo.Address"/>
<bean id="student" class="com.zjz.pojo.Student">
<!--第一种,普通值注入,直接使用value-->
<property name="name" value="zjz"></property>
<!--第二种,bean注入 ref-->
<property name="address" ref="Address"/>
<!-- 数组注入,ref-->
<property name="Books">
<array>
<value>博客</value>
<value>Gitee</value>
<value>DIY博客</value>
</array>
</property>
<!--list -->
<property name="hobbys">
<list>
<value>敲代码</value>
<value>做算法</value>
<value>学知识</value>
</list>
</property>
<!--Map-->
<property name="card">
<map>
<entry key="身份证" value="HHh1"/>
<entry key="银行卡" value="HHH2"/>
<entry key="门禁卡" value="HHH3"/>
</map>
</property>
<!--set-->
<property name="game">
<set>
<value>LOL</value>
<value>CF</value>
<value>Study</value>
</set>
</property>
<!-- null-->
<property name="wife">
<null></null>
</property>
<!--properties-->
<property name="info">
<props>
<prop key="driver"></prop>
<prop key="url"></prop>
<prop key="username"></prop>
<prop key="password"></prop>
</props>
</property>
</bean>
</beans>
五.3.拓展方式注入
p命名 c命名
<?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:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- p 命名空间注入,可以直接注入属性的值:property-->
<bean id="user" class="com.zjz.pojo.User" p:name="user1" p:age="18"/>
<!--c命名空间注入,通过构造器注入,construct-args -->
<bean id="user2" class="com.zjz.pojo.User" c:name="user2" c:age="99"></bean>
</beans>
六.1.单例模式(Spring默认机制)
<bean id="user" class="com.zjz.pojo.User" p:name="user1" p:age="18" scope="singleton"/>
六.2.原型模式
<!-- scope 为prototype 原型模式 --> <bean id="user" class="com.zjz.pojo.User" p:name="user1" p:age="18" scope="prototype"/>
六.3.其余的request,session,application,,,这些只能在web开发中使用到!
三种装配方式
1.在XML中显示的配置(手动)
2.在java中显示配置
3.隐式的自动装配(自动)
xml使用注意:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
1.手动装配,
2.自动装配 依据:Bean的特性---
实现方式---Spring满足bean依赖的一种方式
基于set方法的自动装配:
共同:都是要走set方法的,没set方法怎么弄数据。。。当然,之前也说了,构造器也可哈~
byName
<!--
byName: 会自动在上下文中查找,和自己对象set方法后面值对应的beanId
-->
<!--手动装配,id的形式,cat,dog 都是构造器的形式-->
<bean id="cat" class="com.zjz.pojo.Cat"/>
<bean id="dog" class="com.zjz.pojo.Dog"/>
<!--此时Test 会将cat dog 都打印出来-->
<bean id="people" class="com.zjz.pojo.People" autowire="byName">
<property name="name" value="zjz"/>
</bean>
byType
<!--byType : 会自动在上下文中查找,和自己对象属性类型相同的bean-->
<!--手动装配,cat,dog 都是构造器的形式-->
<bean class="com.zjz.pojo.Dog"/>
<bean class="com.zjz.pojo.Cat"/>
<!--此时Test 会将cat dog 都打印出来-->
<bean id="people" class="com.zjz.pojo.People" autowire="byType">
<property name="name" value="zjz"></property>
</bean>
jdk1.5支持的,Spring2.5就支持了
七.二.1.准备工作:
1. 在spring配置文件中引入context文件头
<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.xsd
http://www.springframework.org/schema/context // 第二句
http://www.springframework.org/schema/context/spring-context.xsd"> // 第三句
2.开启属性注解支持!
<context:annotation-config/>
七.二.2. @Autowired
三个注解 都spring的---
@Autowired @Qualifier @Nullable
搭配解决各种问题用在主类导入子类的字段,方法上(Has-a)
1.使用::查看源码--
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(Retentionpolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
可以加的位置有字段,方法,参数(构造器使用)---括号内可以写required=true(default)||false
false 就是这里可以为null 同 @Nullable
@Qualifier(value="value")
来指定bean的id值 -- Qualifier不能单独使用3.使用AutoWired我们就可以不用编写set方法了,前提是你这个自动装配的属性在IOC(spring)容器中存在
前提--你得确保是引入对应的bean
使用@Nullable
标注一个字段,说明这个字段可以为null,不会null指针
特别的是java的注解 同样可以完成自动装配 @Resource
@Autowired与@Resource异同
:它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先 byName。
总:
以上是脚本宝典为你收集整理的Spring系列-SpringBase+IOC全部内容,希望文章能够帮你解决Spring系列-SpringBase+IOC所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。