Spring笔记
Spring 学习Spring 以Ioc(控制反转)和AOP(面向切面编程)为内核的开源框架。何为IoC?控制反转或者依赖注入,通常创建对象时是new xxx对象,而“反转”就是对象的调用不再由调用者调用,而由spring容器创建。控制权发生变化。就相当于一个中介。为啥多此一举的弄多个第三方吗?降低大型系统的耦合性。详细 [IOC](https://www.cnblogs.com/xdp-gacl
Spring 学习
Spring 以Ioc(控制反转)和AOP(面向切面编程)为内核的开源框架。I
何为IoC?
控制反转或者依赖注入,通常创建对象时是new xxx对象,
而“反转”就是对象的调用不再由调用者调用,而由spring容器创建。控制权发生变化。就相当于一个中介。
为啥多此一举的弄多个第三方吗?降低大型系统的耦合性。
核心容器
BeanFactory 和ApplicationContext
BeanFactory 不常用或者资源少时使用,是Spring里面最低层的接口,提供了最简单的容器的功能,
只提供了实例化对象和拿对象的功能;
BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;
ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("路径"));
ApplicationContext
BeanFactory的子接口多了AOP 事务 国际化等方面支持
两种创建方式
ClassPathXmlApplicationContext从类路径下加载 xmL 配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService)applicationContext.getBean("bookService");
FileSystemXmlApplicationContext不常用,从文件系统中加载配置文件
ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("xx.xml");
bean实例化
3种
无参构造器 根据默认无参构造方法来创建类对象
public class bean {
public void test(){
System.out.println("无参构造实例化");
}
}
<bean id="bean1" class="dao.bean"></bean>
静态工厂
<bean id="bean2" class="dao.staticFactory" factory-method="createBean"></bean>
public class staticFactory {
public static bean createBean(){
return new bean();
}
}
实例工厂
<bean id="beanfactory" class="dao.instanceFactory"></bean>
<bean id="bean3" factory-bean="beanfactory" factory-method="createBean"></bean>
public class instanceFactory {
public bean createBean(){
return new bean();
}
}
区别:。。。。
bean的装配
bean的装配(依赖注入)与实例化的区别:实例化只是new一个对象而转配过程是先实例化对象再注入属性或者其他依赖对象。
4种装配方式:XML ,ANNOTATION(注解),自动装配。
XML装配:
1.构造配置
private int id;
private String name;
private List<String> list;
//构造配置
public User(int id, String name, List<String> list) {
this.id = id;
this.name = name;
this.list = list;
}
<bean id="user1" class="User">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="yu"></constructor-arg>
<constructor-arg index="2">
<list>
<value>"ddd"</value>
<value>"cccc"</value>
</list>
</constructor-arg>
</bean>
2.setter必须有无参构造
相对应的set方法
//setter配置
public User() {
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setList(List<String> list) {
this.list = list;
}
<bean id="user2" class="User">
<property name="name" value="z"></property>
<property name="id" value="1"></property>
<property name="list">
<list>
<value>"ddd"</value>
<value>"cccc"</value>
</list>
</property>
</bean>
注解装配
要求命名空间context,
扫描context:component-scan base-package=""
@Component取代bean class=""
@Component("id")取代bean id="" class="“
另外几个相同果,名字不一样,用在不同地方区别
DAO层:@Repository
service层:@Service
web层:@Controller
<context:component-scan base-package="users"></context:component-scan>
@Repository("bean4")
public class User {
private int id;
private String name;
public User() {
}
}
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("bean4");
System.out.println(user);
注解的依赖注入
@value("xx")给私有字段设置,也可以给setter方法设置
@Autowired 按照类型引入
@Autowired
@Qualifier(“名称”) 按照名称
=@Resource(name=“名称”)
@PostConstruct 初始化
@PreDestroy 销毁
、、、、
@Component
public class xx {
}
@Repository("bean4")
public class User {
@Value("1")
private int id;
private String name;
@Autowired//按照类型
private xx x;
public User() {
}
public void setX(xx x) {
this.x = x;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", x=" + x +
'}';
}
public void setId(int id) {
this.id = id;
}
@Value("张三")
public void setName(String name) {
this.name = name;
}
}
//结果:User{id=1, name='张三', x=users.xx@14555e0a}
@Component("xxid")//按照名称
public class xx {
}
@Autowired
@Qualifier("xxid")
private xx x;
//或者Resource(name = "xxid")
// private xx x;
自动装配
两种方式5个属性值
default,byName,byType,constructor,no
XML自动装配
byName根据setter寻找
byType 根据类型找
public class Cat {
}
public class Dog {
}
public class People {
private Dog dog;
private Cat cat;
private int id;
public void setDog(Dog dog) {
this.dog = dog;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public void setId(int id) {
this.id = id;
}
}
<bean id="dog" class="users.Dog"></bean>
<bean id="cat" class="users.Cat"></bean>
<bean id="people" class="users.People" autowire="byName">
<property name="id" value="1"></property>
</bean>
注解自动装配
<bean id="dog" class="users.Dog"></bean>
<bean id="cat" class="users.Cat"></bean>
<!-- 注解自动装配-->
<bean id="people1" class="users.People">
<property name="id" value="1"></property>
</bean>
public class People {
@Autowired
private Dog dog;
@Autowired
private Cat cat;
private int id;
.....}
//可以与 @Qualifier(value = "cat")cat是xml里面的id
private Cat cat;
下一篇AOP
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)